次のコマンドを使用して多くのファイルをコピーしたいと思います。
cp `find /Volumes/DATA/ -name "*.app" -depth 1 2> /dev/null` /Volumes/VMWare/img/
しかし、これは空白が見つかった場合は順序の終わりとして解釈されるので機能しません。
この問題をどのように解決しますか?
答え1
まず、findはその結果として何かをすることができます-exec {}
。次のことができます。
find /Volumes/DATA/ -name "*.app" -depth 1 2> /dev/null -exec cp '{}' /Volumes/VMWare/img/ \;
ファイルプレースホルダー "{}"の周りに一重引用符があることを確認してください。
xargs でパイプを使用することもできます。
答え2
の現代形式と同様に、zsh
分割は基本的にSPC、TAB、NL、およびNULを含む文字に基づいています。`...`
$(...)
$IFS
これらのうち、NULだけがファイルパスに表示されないため、次のものが必要です。
IFS=$'\0'
cp $(find /Volumes/DATA/ -name "*.app" -depth 1 -print0 2> /dev/null) /Volumes/VMWare/img/
$(...)
または、グローバルパラメータで実行された暗黙的なトークン化を使用する代わりに、明示的な分割演算子を使用してください。
cp ${(0)"$(find /Volumes/DATA/ -name "*.app" -depth 1 -print0 2> /dev/null)"} /Volumes/VMWare/img/
しかし、とにかくfind
ここではそれを使用しても何の利点もありません。
cp /Volumes/DATA/*.app(D) /Volumes/VMWare/img/
(ここではglob修飾子が使用されているので、隠しファイルもD
含まfind
れています。とにかくスキップしたいかもしれません)。
答え3
ファイル名をNULLで終了するには-print0
withを使用し、標準入力のファイル名がNULLで終了することを示すには、この出力をwithに指定します。そして、初期パラメータの文字列を置き換えるために使用されます。find
xargs
-0
xargs
-I
find /Volumes/DATA/ -name '*.app' -maxdepth 1 -print0 | xargs -0 -I fn cp fn /Volumes/VMWare/img/