web-dev-qa-db-ja.com

「./」プレフィックスのないファイル名でfindanddoコマンドを使用します

複数のサブディレクトリのファイル名に対して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する方法はありますか?

3

他の場所でコマンドが正常に機能していても、まだ欠陥があります。 シェルコードに{}を埋め込まないでください

正しいアプローチは次のとおりです。

find my-dir -path "*/*" -execdir sh -c 'cp -- "$1" "foo-${1#./}"' sh {} \;

ここで、${1#./}は、先頭の./(存在する場合)を削除する責任があります。注 二重ダッシュ を使用しました。これは、find./プレフィックス付きの名前を生成する場合は不要です(ただし無害です)が、それ以外の場合は便利です。

ノート:

  • このコマンドは、一致するwhateverがファイルであるかどうかをチェックしません。ディレクトリの場合、cpから警告が表示されます。
  • このコマンドは、foo-whateverが存在するかどうかとそれが何であるかをチェックしません。存在する場合は、ファイルかディレクトリかによって異なる結果が得られます。 whateverの前または後に処理されるかどうかによって異なります。
5