特定の名前のファイルを含むすべてのサブディレクトリにファイルをコピーします。

特定の名前のファイルを含むすべてのサブディレクトリにファイルをコピーします。

features[30,55].RデスクトップのスクリプトをDONE

次のコマンドを試しました。

find . -name "DONE"  -exec sh  'cp /Users/percyli/Desktop/features[30,55].R {}' \;

ただし、次のエラーが発生します。

sh: cp /Users/percyli/Desktop/features[30,55].R ./DONE: No such file or directory
sh: cp /Users/percyli/Desktop/features[30,55].R ./F3/F3-1/DONE: No such file or directory

その中には、./F3/F3-1「DONE」ファイルを含むフォルダの1つがあります。

私も次のことを試しました。

find . -name "DONE"  -exec cp /Users/percyli/Desktop/features[30,55].R {} \;

エラーは出力されませんが、このコマンドを実行した後は文字通り何も起こりません。

ここで問題は何であり、どのように解決しますか?

答え1

f='/path/to/features[30,55].R'

find . -type f -name DONE \
    -exec sh -c 'echo cp "$1" "$(dirname "$2")"' sh "$f" {} ';'

shこれにより、指定されたファイルをそのファイルがあるディレクトリにコピーするスクリプトが正しく呼び出されますDONE

echo正しい作業を行っていると確信している場合は、削除してください。

または、

find . -type f -name DONE \
    -execdir cp "$f" . ';'

...あなたがfind持っているなら-execdir


3つの質問があります。

  1. エラーはを省略して発生します-c。これは(すべて1つの名前)という名前のスクリプトを実行しようとしていることsh -cを意味します。ファイルが見つかりませんでした。shcp /Users/perc...

  2. サブシェルもファイル名を誤って引用しました。ファイル名にはワイルドカード文字が含まれているため、引用符で囲む必要があります。

  3. これを{}スクリプトに入れることは潜在的に危険である可能性があり、少なくとも混乱した結果を引き起こす可能性があります。例を見るSolaris 10でファイル名の代わりにfind / -exec sh -c "echo {}"が "{}"を印刷するのはなぜですか?

2回目の試みでは、DONEこれらのファイルはRスクリプトの内容で上書きされます。ここでは、Rスクリプトのファイル名も引用する必要があります(ただし、これは問題を解決しません)。

関連情報