
Ich muss einige Dateien kopieren, die so aussehen:
folder1/name1.csv
folder1/name2.csv
folder2/name1.csv
folder2/name2.csv
folder3/name1.csv
folder3/name2.csv
Alle Ordner* sind Unterverzeichnisse eines Verzeichnisses. Ich möchte alle Dateien „name*“ in ein neues Verzeichnis new_dir kopieren, muss dafür aber deren Namen ändern. Auf der Suche nach Hilfe habe ich versucht
find . -name 'name*.csv' -exec cp --backup=t '{}' new_dir/ \;
Aber ich erhalte die Meldung „cp: ‚./new_dir/name1.csv‘ und ‚./new_dir/name1.csv‘ sind dieselbe Datei“.
Wie kann ich dem Namen ein Präfix oder Suffix hinzufügen, damit ich sie kopieren kann? Das Hinzufügen einer Ganzzahl ist in Ordnung, sodass die Dateien im neuen Verzeichnis wie folgt aussehen:
new_dir/name10.csv
new_dir/name21.csv
new_dir/name12.csv
new_dir/name23.csv
new_dir/name14.csv
new_dir/name25.csv
...
Oder, noch besser, ich kann die Datei umbenennen und den Namen des Ordners hinzufügen, aus dem sie kopiert werden, etwa:
new_dir/name1folder1.csv
new_dir/name2folder1.csv
new_dir/name1folder2.csv
new_dir/name2folder2.csv
new_dir/name1folder3.csv
new_dir/name2folder3.csv
...
Vielen Dank im Voraus.
Antwort1
Gegeben
$ 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
Anschließend wird eine Shell-Schleife mit Parametererweiterung verwendet, um die Namen zu zerlegen und zu analysieren.
$ 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