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:_
私の問題は、コマンドの最初のオプションshの前にaがないことです-exec
。 findコマンドをどのように機能させるかについて疑問に思う人は、次のものを追加するとすべてがうまくいく_
でしょう。
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
以下の回答は同じことを行いますが、より効率的でエレガントなので受け入れました。
ベストアンサー1
特定の種類のファイルを特定のディレクトリにコピーしますか?これを行う方が優れているxargs
必要はありませんsh
。これはより適切なアプローチであり、より効率的に実行する必要があります。
find "$sourcedir" -type f -name "*.type" | xargs cp -t targetdir
特殊ファイル名を処理する必要がある場合はNULL
区切り文字として使用
find "$sourcedir" -type f -name "*.type" -print0 | xargs -0 cp -t "$targetdir"