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つの質問があります。
エラーはを省略して発生します
-c
。これは(すべて1つの名前)という名前のスクリプトを実行しようとしていることsh -c
を意味します。ファイルが見つかりませんでした。sh
cp /Users/perc...
サブシェルもファイル名を誤って引用しました。ファイル名にはワイルドカード文字が含まれているため、引用符で囲む必要があります。
これを
{}
スクリプトに入れることは潜在的に危険である可能性があり、少なくとも混乱した結果を引き起こす可能性があります。例を見るSolaris 10でファイル名の代わりにfind / -exec sh -c "echo {}"が "{}"を印刷するのはなぜですか?
2回目の試みでは、DONE
これらのファイルはRスクリプトの内容で上書きされます。ここでは、Rスクリプトのファイル名も引用する必要があります(ただし、これは問題を解決しません)。