Der Befehl find / rename funktioniert nicht

7

Ich benutze Linux Slackware 14.0, Bash 4.2. Angenommen, ich habe 2 Dateien im Verzeichnis:

bash-4.2$ ls
1.txt  2.txt

Ich möchte sie in .svg umbenennen. Diese Antwort wird akzeptiert und positiv bewertet, daher denke ich, dass sie funktionieren muss. Er benutzte diesen Befehl:

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;

Also habe ich den analogen Befehl geschrieben, aber er hat einen Fehler ausgegeben:

bash-4.2$ find . -name "*.txt" -exec rename -v 's/\.txt$/\.svg/i' {} \;
rename: not enough arguments

Wenn ich nur die Dateien drucken möchte, funktioniert es:

bash-4.2$ find . -name "*.txt" -print
./1.txt
./2.txt

Ich weiß, dass ich mit einem einfacheren Ansatz umbenennen kann:

bash-4.2$ rename .txt .svg ./*.txt
bash-4.2$ ls
1.svg  2.svg

Aber warum funktioniert der Befehl aus dieser Antwort bei mir nicht?

user4035
quelle
1
Unter Linux gibt es zwei völlig unterschiedliche Umbenennungsimplementierungen: die von perl(was diese Antwort voraussetzt) ​​und die von util-linux (die Sie haben).
Stéphane Chazelas
@StephaneChazelas Wie konvertiere ich diese Antwort, um meine Implementierung zu verwenden?
user4035
4
find . -name '*.txt' -exec rename .txt .svg {} +
Stéphane Chazelas
@StephaneChazelas Arbeitete, danke. Wo kann ich die Dokumente lesen und die von Ihnen verwendete Syntax erläutern: '{} +'?
user4035
info --index-search=-exec find
Stéphane Chazelas

Antworten:

10

Bei renameLinux-Distributionen werden zwei Befehle aufgerufen . Es gibt eines der grundlegenden Linux-Dienstprogramme , das wie folgt verwendet wird:

rename SUBSTRING REPLACEMENT FILE...

Dieser Befehl ersetzt das erste Auftreten von SUBSTRING durch REPLACEMENT in jeder der angegebenen Dateien. Es werden nur einfache Zeichenfolgen unterstützt, keine Platzhalter oder regulären Ausdrücke. Unter Debian und Derivaten (Ubuntu, Mint usw.) wird dieser Befehl aufgerufen rename.ul. Auf anderen Linux-Distributionen heißt es rename.

Es gibt auch ein Perl-Skript,rename das wie folgt verwendet wird:

rename 'PERL CODE' FILE...

Eine gebräuchliche Form des Perl-Codes ist rename 's/REGEXP/REPLACEMENT/' FILE..., dass das erste Auftreten von REGEXP durch REPLACEMENT in jedem Dateinamen s/REGEXP/REPLACEMENT/gersetzt wird ( ersetzt alle Vorkommen).

Der Autor der Frage, die Sie gesehen haben, gab an, dass er Ubuntu ausführt, daher akzeptierte er diese Antwort mit dem renameauf Ubuntu gefundenen Befehl.

Das Analogon für den Standardbefehl renameist

find . -name "*.txt" -exec rename .txt .svg {} \;

Mit bash ≥4 können Sie das **Platzhaltermuster verwenden, nachdem Sie die globstarOption zum Abgleichen von Dateien in Unterverzeichnissen ohne Verwendung festgelegt haben find.

shopt -s globstar
rename .txt .svg **/*.txt

Beachten Sie, dass dieser renameBefehl auf die erste Zeichenfolge angewendet wird. Wenn Sie also eine Datei mit dem Namen haben hello.txt.world.txt, wird diese in umbenannt hello.svg.world.txt.

Gilles 'SO - hör auf böse zu sein'
quelle