find コマンドパスの空白を修正

find コマンドパスの空白を修正

次のコマンドを使用して多くのファイルをコピーしたいと思います。

 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で終了するには-print0withを使用し、標準入力のファイル名がNULLで終了することを示すには、この出力をwithに指定します。そして、初期パラメータの文字列を置き換えるために使用されます。findxargs-0xargs-I

find /Volumes/DATA/ -name '*.app' -maxdepth 1 -print0 | xargs -0 -I fn cp fn /Volumes/VMWare/img/

関連情報