動的プレフィックス/サフィックスを追加してファイルをコピーして名前を変更する

動的プレフィックス/サフィックスを追加してファイルをコピーして名前を変更する

次の一部のファイルをコピーする必要があります。

folder1/name1.csv
folder1/name2.csv
folder2/name1.csv
folder2/name2.csv
folder3/name1.csv
folder3/name2.csv

すべてのフォルダ*はディレクトリのサブディレクトリです。私がしたいのは、 "name *"ファイルをすべてnew_dirという新しいディレクトリにコピーすることですが、名前を変更する必要があります。助けを求めようとしました。

find . -name 'name*.csv' -exec cp --backup=t '{}' new_dir/ \;

ただし、「cp: './new_dir/name1.csv' e './new_dir/name1.csv'は同じファイルです」というメッセージが表示されます。

コピーできるように名前にプレフィックスまたはサフィックスを追加するにはどうすればよいですか? new_dirファイルに次のように見えるように整数を追加するだけです。

new_dir/name10.csv
new_dir/name21.csv
new_dir/name12.csv
new_dir/name23.csv
new_dir/name14.csv
new_dir/name25.csv
...

または、次のようにファイルがコピーされたフォルダの名前を追加してファイルの名前を変更できる場合は、これをお勧めします。

new_dir/name1folder1.csv
new_dir/name2folder1.csv
new_dir/name1folder2.csv
new_dir/name2folder2.csv
new_dir/name1folder3.csv
new_dir/name2folder3.csv
...

よろしくお願いします。

答え1

与えられた

$ tree folder*
folder1
├── name1.csv
├── name2.csv
└── name3.csv
folder2
├── name1.csv
├── name2.csv
└── name3.csv
folder3
├── name1.csv
├── name2.csv
└── name3.csv

0 directories, 9 files

次に、パラメータ拡張を含むシェルループを使用して名前を分割して分割します。

$ for f in folder*/name*.csv; do 
    b="${f##*/}"; 
    echo cp "$f" new_dir/"${b%.csv}${f%/*}.csv"
  done
cp folder1/name1.csv new_dir/name1folder1.csv
cp folder1/name2.csv new_dir/name2folder1.csv
cp folder1/name3.csv new_dir/name3folder1.csv
cp folder2/name1.csv new_dir/name1folder2.csv
cp folder2/name2.csv new_dir/name2folder2.csv
cp folder2/name3.csv new_dir/name3folder2.csv
cp folder3/name1.csv new_dir/name1folder3.csv
cp folder3/name2.csv new_dir/name2folder3.csv
cp folder3/name3.csv new_dir/name3folder3.csv

関連情報