![衝突時にコピーして名前を変更する](https://rvso.com/image/88765/%E8%A1%9D%E7%AA%81%E6%99%82%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%81%A6%E5%90%8D%E5%89%8D%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B.png)
これらのフォルダーの内容をコマンド ラインでマージしたいと思います。
.
├── 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
。