
Ich möchte Folgendes tun können: umbenennen string1
und string3
am string2
Anfang hinzufügen. Etwas wie „Fish“ wird in „Great_Bear“ umbenannt, wenn die Zeichenfolge „Fish“ gefunden wird und „Great_“ = Zeichenfolge2 ist.
Bisher habe ich Folgendes:
ls | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash
Dies erledigt die Aufgabe für das aktuelle Verzeichnis.
ls -d $PWD/**/* | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash
Dies funktioniert nur in Unterverzeichnissen und nicht in dem, in dem sich das Skript befindet.
Außerdem würde ich gerne wissen, wie man string2
am Anfang des Dateinamens etwas hinzufügt.
Antwort1
rename
Ich würde es mit einem einfachen Streichholz verwenden */*
, nicht mit dem Globstar-Muster.
rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn
Wir gleichen ein Verzeichnis ab und dann etwas, das es enthält. Das ist etwas sicherer als Globstar, weil wir nicht zu weit rekursieren wollen.
Das -n
am Ende stoppt es tatsächlichtunalles. Es wird es Ihnen nur zeigen. Entfernen Sie es, wenn Sie sicher sind, dass es richtig ist. Hier ist jedoch ein kleiner Test-Harness:
$ mkdir -p test/test{1..3} && touch test/test{1..3}/file{1..3}
$ cd test
$ rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn
test1/file1 renamed as test1/test1_file1
test1/file2 renamed as test1/test1_file2
test1/file3 renamed as test1/test1_file3
test2/file1 renamed as test2/test2_file1
test2/file2 renamed as test2/test2_file2
test2/file3 renamed as test2/test2_file3
test3/file1 renamed as test3/test3_file1
test3/file2 renamed as test3/test3_file2
test3/file3 renamed as test3/test3_file3
Antwort2
Das hier sollte funktionieren:
find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
find . -type f -exec
: sucht rekursiv nach Dateien in der Hierarchie des aktuellen Arbeitsverzeichnisses und führt den Rest der Befehlszeile aus, wobei{} +
die Ergebnisliste erweitert wird;rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
: gleicht eine beliebige Anzahl beliebiger Zeichen ab und gruppiert sie bis zum letzten Vorkommen von/
, gleicht ein ab/
, gleicht eine beliebige Anzahl beliebiger Zeichen ab und gruppiert sie bis zum letzten Vorkommen vonstring1
, gleichtstring1
ab und gleicht eine beliebige Anzahl beliebiger Zeichen ab und gruppiert sie; ersetzt die Übereinstimmung durch die erste erfasste Gruppe, gefolgt von einem/
Zeichen, gefolgt vonstring3
gefolgt von der zweiten erfassten Gruppe, gefolgt vonstring2
gefolgt von der dritten erfassten Gruppe (-n
führtrename
einen Probelauf durch; entfernen Sie es, um die Dateien tatsächlich umzubenennen).
% tree
.
└── dir
├── string1_bar.jpg
├── string1_foobar.jpg
└── string1_foo.jpg
1 directory, 3 files
% find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
rename(./dir/string1_foo.jpg, ./dir/string3string2_foo.jpg)
rename(./dir/string1_foobar.jpg, ./dir/string3string2_foobar.jpg)
rename(./dir/string1_bar.jpg, ./dir/string3string2_bar.jpg)