
author - name
Ich möchte eine Zeichenfolge wie in den Dateinamen einiger Bücher in ändern name - author
. Ich versuche
ls * | sed -r 's/(.+) - (.+).pdf/mv \2 - \1.pdf/' | sh
Vielleicht ist es eine Mischung aus Vertauschen Sie zwei Zeichenfolgen beliebiger Länge, die durch ein Symbol getrennt sind UndMehrere Dateien mit sed umbenennen
Das funktioniert nicht
for file in *; do mv "$file" "$(echo "$file" | sed -r 's/(.+) - (.+).pdf/\2 - \1.pdf/')"
Auch nicht
rename 's/\([.]+\) - \([.]+\)\.pdf/\2 - \1\.pdf/' *
Das funktioniert
rename 's/(.+) - (.+).pdf/\2 - \1.pdf/' *
Antwort1
Versuche dies
% ls -1
001-foobar.pdf
002-foobar.pdf
003-foobar.pdf
Code
% rename -n 's/([^-]+)-([^\.]+)\.pdf/$2-$1.pdf/' *.pdf
001-foobar.pdf -> foobar-001.pdf
002-foobar.pdf -> foobar-002.pdf
003-foobar.pdf -> foobar-003.pdf
Notiz
(Entfernen Sie den Schalter -n, wenn Ihre Tests in Ordnung sind)
Es gibt andere Tools mit demselben Namen, die dazu möglicherweise in der Lage sind, möglicherweise aber auch nicht. Seien Sie also vorsichtig.
Wenn Sie den folgenden Befehl ausführen ( GNU
)
$ file "$(readlink -f "$(type -p rename)")"
und Sie haben ein Ergebnis wie
.../rename: Perl script, ASCII text executable
und nicht enthalten:
ELF
dann scheint dies das richtige Werkzeug zu sein =)
Wenn nicht, machen Sie es zum Standard (normalerweise bereits der Fall) Debian
und verwenden Sie eine Ableitung wie Ubuntu
:
$ sudo update-alternatives --set rename /path/to/rename
(Ersetzen Sie es /path/to/rename
durch den Pfad Ihres perl's rename
Befehls.
Wenn Sie diesen Befehl nicht haben, suchen Sie in Ihrem Paketmanager nach ihm odermach es manuell
Und nicht zuletzt wurde dieses Tool ursprünglich von Larry Wall, dem Vater von Perl, geschrieben.
Antwort2
Ich gehe davon aus, dass die Dateinamen dem Muster folgen author - name.pdf
und dass sowohl author
als auch name
alle gültigen Zeichen außer -
den von Leerzeichen umgebenen enthalten können.
find . -type f -name '* - *.pdf' \
-execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;
Dadurch werden alle regulären Dateien im aktuellen Verzeichnis gefunden, deren Namen dem Muster entsprechen * - *.pdf
.
Für jede solche Datei wird eine Subshell ausgeführt. Die Subshell führt folgende Aktionen aus:
b=${1% - *} # pick out the start of the filename
e=${1#* - } # pick out the end of the filename
# Combine $b and $e into a new filename while removing ".pdf" from
# the end of the original filename and adding it to the end of
# the new filename instead.
mv "$1" "${e%.pdf} - $b.pdf"
Testen:
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Aug 30 11:31 arr! - Boaty McBoatface.pdf
-rw-r--r-- 1 kk wheel 0 Aug 30 11:30 hello world - bingo-night!.pdf
$ find . -type f -name '* - *.pdf' -execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Aug 30 11:31 Boaty McBoatface - arr!.pdf
-rw-r--r-- 1 kk wheel 0 Aug 30 11:30 bingo-night! - hello world.pdf
Wenn Sie es erneut ausführen, werden die Namen wieder auf die ursprünglichen zurückgesetzt.