2

Windows ユーザー ディレクトリ内のユーザー ファイルをバックアップ ドライブにコピーできるスクリプトを作成しようとしていました。Appdata以外のすべてを転送したいです。本当に簡単なスクリプトを作成しましたが、転送するフォルダーの名前にスペースが含まれているため (例: '/media/gage/Backup\ Drive/')、Drive'存在しないと表示されます。

ディレクトリをファイルマネージャーから端末にドラッグアンドドロップ/ペーストしようとしていますが、'ドラッグするとパス全体に s が表示されます。入力に ​​s で囲まれたファイル名を認識させる方法はあります'か?

これが私がこれまでに持っているものです(私は本当にbashスクリプトに慣れていません)

#!/bin/bash
echo "Enter the full path to the user's directory"
read srcName
echo "Enter the full path to the backup directory"
read dstName
echo "Copying from Users to Backup"
cd $srcName
cp -rp Documents $dstName
cp -rp Pictures $dstName
cp -rp Desktop $dstName
cp -rp Music $dstName
cp -rp Videos $dstName
cp -rp Downloads $dstName
cp -rp Favorites $dstName

どんな助けでも大歓迎です

ありがとう。

4

1 に答える 1

3

ターミナルは、ドラッグ アンド ドロップとコピー アンド ペーストの両方よりも前から存在するため、どちらも堅牢な方法で統合されていません。何をすべきかを決定するのは、各端末エミュレーター次第です。

グラフィカル ファイル マネージャーから 1 つまたは複数のファイルをドラッグ アンド ドロップしたときの一般的な反応は次のとおりです。

  • xterm何もしません。
  • gnome-terminalスペースで区切られたシェルエスケープされた単語としてパスを入力したふりをします。各単語は適切なエスケープで完全に単一引用符で囲まれています。

    '/path/foo' '/path/Rock Lobster - B-52'\''s.mp3'

  • konsoleメニューが表示され、シェルの現在のディレクトリにコピー/移動するか、メタ文字が含まれている場合にのみ単一引用符で囲まれたシェルエスケープされた単語としてパスを貼り付けることができます。

    /path/foo '/path/Rock Lobster - B-52'\''s.mp3'

あなたが説明していることから、あなたは使用していてgnome-terminal、一重引用符を含むファイルをドラッグアンドドロップして、ファイル名に対して他に何をするかを確認しようとしませんでした。


それで、あなたは何ができますか?

ファイルをドラッグ アンド ドロップするのではなく、パスをそのままコピー アンド ペーストすることをお勧めします。これが他のすべてのプログラムの仕組みであり、Charles Duffy のソリューションでできることです。

ファイルをドラッグするのではなく、パスを文字列としてコピー アンド ペーストするには、通常、ファイル マネージャーで [プロパティ] タブまたは [詳細] タブを開き、そこからフル パスをコピーします。

ただし、楽しみのために、本当に必要な場合は、ファイル マネージャーから入力をドラッグ アンド ドロップされたファイルとして解釈する方法を示しますeval

#!/bin/bash    
echo "Drag&Drop files/dirs and press enter when done."
echo "Do not drag&drop/paste/type text, because it will be evaluated as code."
IFS="" read -r input
eval "files=( $input )"

echo "Here are the things you pasted:"
for file in "${files[@]}"
do
  ls -ld "$file"
done

次のように実行されます。

$ ./test
Drag&Drop files/dirs and press enter when done.
Do not drag&drop/paste/type text, because it will be evaluated as code.
'/usr/local/home/me/Documents' '/usr/local/home/me/Downloads'

Here are the things you pasted:
drwxr-x--- 3 me eng 4096 Aug  7 13:46 /usr/local/home/me/Documents
drwxr-x--- 2 me eng 4096 Aug 17 14:32 /usr/local/home/me/Downloads
于 2015-08-17T22:00:51.617 に答える