2

UbuntuでBASHを使用して一連のファイルとフォルダーをコピーしようとしています。ファイルは、フラッシュドライブに追加された順序でファイルを読み取るデジタルフォトフレームで処理されるため、アルファベット順にコピーすることが重要です。私が発見したことから、Nautilusはiノード番号に基づいてそれらをコピーするため、額縁上で順序が狂ってしまいます。

私が行った検索から、次のコマンドを思いつきました。

for i in "$(find * -type f -print0 | sort)"; do cp -v "$i" "/media/PicFrame/$i"; done

これにより、ファイル名が長すぎるというエラーが発生します。BASHは、すべてのファイル名が「\n」で区切られたファイルを作成しようとしているようです。引用符の一部を削除しようとしましたが、ファイル名の一部をコピーしようとすると、いくつかの「統計できない」エラーが発生します(多くの場合、スペースが含まれているため)。

これを機能させる方法について何かアイデアはありますか?私は他の方法も受け入れていますが、これを、写真を変更するときに毎月実行できる単一のコマンド/スクリプトにしたいと思っています。(私はこれをWindowsで行ってきましたが、現在Ubuntuですべてを実行しようとしています。私は約2年間行ったり来たりしています。)

4

2 に答える 2

3

代わりにループで使用readしてください。while

find ... | while read file
do
  cp ..."$file"...
done

rsyncただし、代わりに使用を検討することをお勧めします。

于 2012-06-04T01:25:28.457 に答える
2

Ignacio が述べたように、使用しているwhile read場合はループを使用する必要がありますfind

再帰が必要ない場合 (ファイルがすべて 1 つのディレクトリ レベルにある場合)、forグロビングでループを使用できます。この手法を使用する場合sort、グロブはロケールの辞書順で展開されることが保証されているため (つまり、「ソート済み」)、使用する必要はありません。

for file in *
do
    cp "$file" dest
done

質問のスクリプトの問題の一部は、の出力をprint0にパイプするために使用していることに注意してください。それを機能させるには、バージョンに適切なオプションがあるかどうかを確認する必要があります。findsortsort

find ... -print0 | sort --files0-from=-
于 2012-06-04T01:39:40.150 に答える