Tauschen Sie zwei durch ein Symbol getrennte Zeichenfolgen in mehreren Dateinamen eines Verzeichnisses aus

Tauschen Sie zwei durch ein Symbol getrennte Zeichenfolgen in mehreren Dateinamen eines Verzeichnisses aus

author - nameIch 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)

Warnung 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) Debianund verwenden Sie eine Ableitung wie Ubuntu:

$ sudo update-alternatives --set rename /path/to/rename

(Ersetzen Sie es /path/to/renamedurch den Pfad Ihres perl's renameBefehls.


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.pdfund dass sowohl authorals auch namealle 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.

verwandte Informationen