複数のサブディレクトリのファイル名に対してcp
を実行し、それらの前にfoo-
を付けると、エラーが発生します。
$ find my-dir -path "*/*" -execdir sh -c 'cp {} foo-{}' \;
cannot create regular file ‘foo-./blabla.jpg’: No such file or directory
MacOSでは、この./
プレフィックスを取得できず、コマンドは正常に機能します。
./
プレフィックスなしでファイル名をcp
する方法はありますか?
他の場所でコマンドが正常に機能していても、まだ欠陥があります。 シェルコードに{}
を埋め込まないでください 。
正しいアプローチは次のとおりです。
find my-dir -path "*/*" -execdir sh -c 'cp -- "$1" "foo-${1#./}"' sh {} \;
ここで、${1#./}
は、先頭の./
(存在する場合)を削除する責任があります。注 二重ダッシュ を使用しました。これは、find
が./
プレフィックス付きの名前を生成する場合は不要です(ただし無害です)が、それ以外の場合は便利です。
ノート:
whatever
がファイルであるかどうかをチェックしません。ディレクトリの場合、cp
から警告が表示されます。foo-whatever
が存在するかどうかとそれが何であるかをチェックしません。存在する場合は、ファイルかディレクトリかによって異なる結果が得られます。 whatever
の前または後に処理されるかどうかによって異なります。