Ersetzen Sie einen Teil des Dateinamens durch eine Zeichenfolge in Unterverzeichnissen und im aktuellen Verzeichnis

Ersetzen Sie einen Teil des Dateinamens durch eine Zeichenfolge in Unterverzeichnissen und im aktuellen Verzeichnis

Ich möchte Folgendes tun können: umbenennen string1und string3am string2Anfang 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 string2am Anfang des Dateinamens etwas hinzufügt.

Antwort1

renameIch 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 -nam 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 von string1, gleicht string1ab und gleicht eine beliebige Anzahl beliebiger Zeichen ab und gruppiert sie; ersetzt die Übereinstimmung durch die erste erfasste Gruppe, gefolgt von einem /Zeichen, gefolgt von string3gefolgt von der zweiten erfassten Gruppe, gefolgt von string2gefolgt von der dritten erfassten Gruppe ( -nführt renameeinen 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)

verwandte Informationen