変数拡張を使用してbashスクリプトで-execを検索する

変数拡張を使用してbashスクリプトで-execを検索する

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"

おすすめ記事