リクエスト:転送するときは、ファイルの末尾に{number}を追加してください

リクエスト:転送するときは、ファイルの末尾に{number}を追加してください

何千ものディレクトリがあり、各ディレクトリにはfile.jpg名前付きファイルがあるサブディレクトリがあります。各サブディレクトリには名前付きファイルがあるため、file.jpgこれらのファイルをすべて同じフォルダに転送することはできません。それとも、最後のファイル(1つ)までお互いを覆うだけです。file.jpg残りました。

代わりに、次のことを行うためにいくつかのコマンドを端末に貼り付けたいと思います。

  1. レビューフォルダにコピーしたら、{number}内容別に追加してください。file.jpg注:何千ものファイルがある可能性があるため、停止する場所に制限はありません。file34634657.jpgたとえば、最後のファイルは 。

file{number}.jpg追加の質問:コピーを元のディレクトリ/サブディレクトリに再追跡する方法はありますか?これらのfile.jpgディレクトリには、確認する必要がある追加のサブディレクトリとファイルが含まれています。

ベストアンサー1

番号の追加が必須でない場合は、ファイル名にパスを追加できます。これにより、2つの「問題」(ファイルを上書きして逆追跡できない)の両方を解決できます。

for ef in $(find * -name file.jpg); do cp $ef /path/to/dest_dir/$(echo $ef | sed 's,/,--,g'); done

- - ファイルの先頭を削除するfind *には、 - - sedを使用して次のように変更します(このコマンドを使用すると、逆追跡するか、代わりにより具体的なものを使用できます)。*./
$(echo $ef | sed 's,/,--,g')/----

編集(以下のOPの説明による):
ディレクトリにスペース/スペースが含まれている場合は、内部フィールド区切り記号(IFS)を変更します。
必要に応じて現在のバックアップを実行し、コマンドの最後に復元できます。

old_IFS=$IFS; IFS=$'\n'; for ef in $(find * -name file.jpg); do cp $ef dest_dir/$(echo $ef | sed 's,/,--,g;s/ /_/g'); done; IFS=$old_IFS
  • old_IFS=$IFS- 現在のIFSをバックアップします(デフォルトでは、spaceおよびtabnewline
  • IFS=$'\n'- 単語の分割を避けるためにIFSをnewline(のみ)に設定します。newlinespace
  • IFS=$old_IFS– IFS をデフォルト値に復元します。

もちろん、s/ /_/gファイル(ターゲットの場所)にディレクトリのスペースが含まれるようにするには、2番目のsedスクリプトを削除し、1つだけ(最初のスクリプト)だけを保持できます。

おすすめ記事