衝突時にコピーして名前を変更する

衝突時にコピーして名前を変更する

これらのフォルダーの内容をコマンド ラインでマージしたいと思います。

.
├── folder1
│   │ file.txt
├── folder2
│   │ file.txt
└───folder3
    │ file.txt

これどうやってするの ?

答え1

ついにこれができるようになりcp--backupフラグ。

cp --backup=numbered */*.txt new_directory/

答え2

次のコマンドライン ループは、現在のディレクトリにある「folder*」という名前のすべてのフォルダの (最上位の) 内容を「new_directory」という名前のディレクトリにコピーします。/*デフォルトでは、glob は「ドット ファイル」と一致しません。shopt -s dotglobこの動作を変更する場合は を使用します。 同じ (基本) ファイル名が new_directory に既に存在する場合は、一意になるように、コピー先のファイルに元のフォルダ (およびアンダースコア) のプレフィックスが付けられます。

すべてを一行で:

for f in folder*/*; do [ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }; [ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"; done

読みやすくするために分割しました:

for f in folder*/*
do 
  [ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }
  [ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"
done

代わりに動くファイルを元の場所からコピーするには、単にcpを に変更しますmv

関連情報