
xargs
人々がファイル名のスペースを処理するのに問題がある同様の質問をここで見ました。驚いたことに、私はこの問題に直面していませんでしたが、同様の問題が発生しました。
多数のファイルから固定された数のファイル(非常に混乱した方法でランダムに選択されています)をコピーしています。コード行は次のとおりです。
find "/path/to/source/dir" -size +1k -type f -print0 | sort -R | ghead -z -n 10 | xargs -0 -I{} cp "{}" "/path/to/destination/dir"
各ファイルの名前は人の名前にちなんで指定されますので、宝くじ当選者に似ていると思います。描かれた人の中には偶然ドイツ人だったので、Matthäus Müllerのような非常にドイツ的な名前を持っていたかもしれません。 (他の特殊文字は考慮されません。)
このコードモンスターが名前(またはより正確にはファイル名)にウムラウトを持つ人を描くたびに、コピープロセスは停止します。
cp: /path/to/source/dir/Matthäus Müller.jpg: No such file or directory
すべてのファイル名にはスペースがあり、発音区別記号が付いたファイル名でのみ中断されるため、問題がスペース文字のためではないことを保証できます。
この問題を解決する方法はありますか?それとも、完全なメカニズムを別々に作成する必要がありますか(もしそうなら、どうすれば)?
注1:これらのファイル名を「Matthaeus Mueller.jpg」または同様のものに変更しても、この問題は回避できません。
注2:これが重要な場合、このスクリプトはmacOSで実行されます。
答え1
-z
NULLで終わるレコードがありませんsort
。この問題を解決すると、問題は消えます(とにかく私の場合)。発音区別符号付きの名前を正常にコピーできるかどうかはかなり可能です。実際にはそれが問題だとは思わない。
はい
mkdir /tmp/610423/{src,dst}
cd /tmp/610423
touch 'src/Matthäus Müller.jpg' 'src/Peter Gurney' 'src/Tom Pearce'
# Error here
find /tmp/610423/src -type f -print0 | sort -R | head -zn10 | xargs -0 -I{} cp {} dst/
cp: cannot stat ''$'\n': No such file or directory
# No error here
find /tmp/610423/src -type f -print0 | sort -zR | head -zn10 | xargs -0 -I{} cp {} dst/
Debian Linuxディストリビューションでテストしました。私はあなたがghead
Debianで標準として使用するGNUプログラムであると仮定します。head
あなたはsort
それを持っていますか-z
?そうでない場合は、残りの-print0
ユーティリティのパフォーマンスをもう一度考えてみることをお勧めします。もちろん大丈夫です。