bashスクリプトで次のようなコマンドを実行しようとしています。のすべてのサブフォルダーを検索し$sourcedir
、特定の種類のすべてのファイルをのルートレベルにコピーする必要があります$targetdir
。
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
ことを除いて、これは、かなり近いように思える{}
ように渡されていない$2
と-exec sh -c ...
これをできる限り「正しい方法」に近づけ、ファイル名の特殊文字(具体的には一重引用符文字)の許容範囲内で行いたいと思います。
編集:私は人々がxargs
引数チェーンを使用することを提案しているのを見ます。私は、これは限られた数の議論に対してのみ大丈夫であるという印象を受けていました。たとえば、多数のギャラリーディレクトリから巨大なスライドショーディレクトリにコピーしようとしている数千の.jpgファイルがある場合、引数をチェーン化したソリューションは引き続き機能しますか?
編集2:私の問題は_
、-exec
コマンドでshする最初のオプションの前に行方不明でした。findコマンドを機能させる方法に興味がある人は_
、すべて追加してください。
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
ただし、同じタスクを実行しますが、より効率的でエレガントなので、以下の回答を受け入れました。
xargs
制限のある通常のコマンドの膨大な量の引数を自動的に処理するために作成された理由です。また考慮すべき点として、最大引数の制限のほとんどは、標準のGNU utilsで大幅に改善されています。また、何千ものファイルに関連するプロセスフォークをすべて回避することで、パフォーマンス上のメリットが得られます。