Ich werde drei Alternativen vorschlagen. Jedes ist ein einfacher einzeiliger Befehl, aber ich werde Varianten für kompliziertere Fälle bereitstellen, hauptsächlich für den Fall, dass die zu verarbeitenden Dateien mit anderen Dateien im selben Verzeichnis gemischt werden.
mmv
Ich würde den Befehl mmv
aus dem gleichnamigen Paket verwenden :
mmv '*HBO_DPM*' '#1dpm#2'
Beachten Sie, dass die Argumente als Zeichenfolgen übergeben werden, sodass die Glob-Erweiterung nicht in der Shell erfolgt. Der Befehl empfängt genau zwei Argumente und sucht dann intern nach entsprechenden Dateien, ohne die Anzahl der Dateien zu begrenzen. Beachten Sie auch, dass der obige Befehl davon ausgeht, dass alle Dateien, die mit dem ersten Glob übereinstimmen, umbenannt werden sollen. Natürlich steht es Ihnen frei, genauer zu sein:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
Wenn Sie Dateien außerhalb des angeforderten Nummernbereichs im selben Verzeichnis haben, ist die Schleife über die weiter unten in dieser Antwort angegebenen Nummern möglicherweise besser für Sie. Sie können jedoch auch eine Folge von mmv-Aufrufen mit geeigneten Mustern verwenden:
mmv 'sb_606_HBO_DPM_0089*' 'sb_606_dpm_0089#1' # 0089000-0089999
mmv 'sb_606_HBO_DPM_009*' 'sb_606_dpm_009#1' # 0090000-0099999
mmv 'sb_606_HBO_DPM_01[0-5]*' 'sb_606_dpm_01#1#2' # 0100000-0159999
mmv 'sb_606_HBO_DPM_016[0-2]*' 'sb_606_dpm_016#1#2' # 0160000-0162999
mmv 'sb_606_HBO_DPM_01630[01]?' 'sb_606_dpm_01630#1#2' # 0163000-0163019
mmv 'sb_606_HBO_DPM_016302[0-2]' 'sb_606_dpm_016302#1' # 0163020-0163022
Schleife über Zahlen
Wenn Sie vermeiden möchten, etwas zu installieren, oder nach Nummernbereich auswählen möchten, Übereinstimmungen außerhalb dieses Bereichs vermeiden möchten, und bereit sind, auf 74.023 Befehlsaufrufe zu warten, können Sie eine einfache Bash-Schleife verwenden:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
Dies funktioniert hier besonders gut, da es keine Lücken in der Sequenz gibt. Andernfalls möchten Sie möglicherweise überprüfen, ob die Quelldatei tatsächlich vorhanden ist.
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
Beachten Sie, dass im Gegensatz zur for ((i=89000; i<=163022; ++i))
Klammererweiterung führende Nullen seit einigen Bash-Veröffentlichungen vor einigen Jahren verarbeitet werden. Eigentlich eine Änderung, die ich angefordert habe, also bin ich froh, Anwendungsfälle dafür zu sehen.
Weiterführende Literatur: Klammererweiterung auf den Bash-Infoseiten, insbesondere der Teil über {x..y[..incr]}
.
Schleife über Dateien
Eine andere Möglichkeit wäre, eine Schleife über ein geeignetes Glob durchzuführen, anstatt nur über den fraglichen Integer-Bereich zu schleifen. Etwas wie das:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
Dies ist wiederum ein mv
Aufruf pro Datei. Auch hier ist die Schleife über eine lange Liste von Elementen verteilt, aber die gesamte Liste wird nicht als Argument an einen Unterprozess übergeben, sondern intern von bash verarbeitet, sodass das Limit keine Probleme verursacht.
Weiterführende Literatur: Shell-Parametererweiterung in den Bash-Infoseiten, dokumentiert ${parameter/pattern/string}
unter anderem.
Wenn Sie den Nummernkreis auf den von Ihnen angegebenen einschränken möchten, können Sie dies überprüfen:
for i in sb_606_HBO_DPM_+([0-9]); do
if [[ "${i##*_*(0)}" -ge 89000 ]] && [[ "${i##*_*(0)}" -le 163022 ]]; then
mv "$i" "${i/HBO_DPM/dpm}"
fi
done
Hier ${i##pattern}
wird die längste Präfixübereinstimmung pattern
von entfernt $i
. Dieses längste Präfix ist definiert als alles, dann ein Unterstrich, dann null oder mehr Nullen. Letzteres wird als *(0)
erweitertes Glob-Muster geschrieben , das von der eingestellten extglob
Option abhängt . Das Entfernen von führenden Nullen ist wichtig, um die Zahl als Basis 10 und nicht als Basis 8 zu behandeln. Das +([0-9])
Argument in der Schleife ist ein weiteres erweitertes Glob, das mit einer oder mehreren Ziffern übereinstimmt, nur für den Fall, dass Sie Dateien haben, die dort gleich beginnen, aber nicht mit a enden Nummer.
ARG_MAX
Limit kollidiert . Da diese Frage ausdrücklich nach einer Befehlszeilenlösung fragt, stimmen (möglicherweise gleiche) GUI-Lösungen wie in der anderen Frage ebenfalls nicht überein.