何千ものディレクトリがあり、各ディレクトリにはfile.jpg
名前付きファイルがあるサブディレクトリがあります。各サブディレクトリには名前付きファイルがあるため、file.jpg
これらのファイルをすべて同じフォルダに転送することはできません。それとも、最後のファイル(1つ)までお互いを覆うだけです。file.jpg
残りました。
代わりに、次のことを行うためにいくつかのコマンドを端末に貼り付けたいと思います。
- レビューフォルダにコピーしたら、
{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
およびtab
)newline
。IFS=$'\n'
- 単語の分割を避けるためにIFSをnewline
(のみ)に設定します。newline
space
IFS=$old_IFS
– IFS をデフォルト値に復元します。
もちろん、s/ /_/g
ファイル(ターゲットの場所)にディレクトリのスペースが含まれるようにするには、2番目のsedスクリプトを削除し、1つだけ(最初のスクリプト)だけを保持できます。