2009-12-25 9 views
32

Mögliche Duplizieren:
rename multiple files at once in unixDateien mit einer Regex mit bash

Ich möchte alle Dateien aus einem Ordner benennen Sie eine regex (fügen Sie einen Namen an das Ende des Namens) und In einen anderen Ordner verschieben.

mv -v ./images/*.png ./test/*test.png 

aber es funktioniert nicht:

Es ist meine Meinung, es sollte wie folgt aussehen werden.

Kann mir jemand eine Lösung vorschlagen?

+1

Im Wesentlichen das gleiche wie viele andere Fragen - wie SO 1086502 (http://stackoverflow.com/questions/1086502/). Es wurde gestern sogar einer gefragt. –

Antwort

44

Versuchen Sie folgendes:

for x in *.png;do mv $x test/${x%.png}test.png;done 
+0

hier ist, was es zurückgibt: verwendung: mv [-f | -i | -n] [-v] Quellziel mv [-f | -i | -n] [-v] Quelle ... Verzeichnis – mxg

+0

@mxg: Entschuldigung, ich habe nicht 100% korrektes Kommando gegeben: Sie brauchen 'cd images' zuerst und dann' test/'mit' ..' – catwalk

+3

Sie sollten Zitate setzen um die Variablennamen, falls Leerzeichen in den Dateinamen vorhanden sind: 'for x in * .png; do mv "$ x" "test/$ {x% .png} test.png"; done' –

48

Wenn Sie auf einem Linux sind, überprüfen Sie spezielle rename Befehl, die genau das tun würde - mit regulären Ausdrücken umbenennen.

rename 's/^images\/(.+)/test\/$1.png/s' images/*.png 

Andernfalls ein Bash-Zyklus über den Dateinamen als catwalk suggested schreiben.

+4

Es kann auf einigen Systemen als 'Vorname' bezeichnet werden. –

+7

viel weniger zu erinnern/typ, danke! 'rename 's/_20// g' * .mp4' – ptim

+1

Der beste, einfachste Weg, es zu tun. Obwohl die Antwort bearbeitet werden könnte, um einige Beispiele wie memeLab zu geben. – Memke

35
$ for old in ./images*.png; do 
    new=$(echo $old | sed -e 's/\.png$/test.png/') 
    mv -v "$old" "$new" 
    done 
+3

Ich mag die Verwendung von sed, da es mir erlaubt, dies mit allem zu ersetzen, was ich mag. in meinem Fall ersetze "% 20" durch "". Ich habe das 'g' am Ende der Regex verwendet, um das zu ermöglichen: für alt in * .pdf; tu new = $ (echo $ alt | sed -e's/\% 20// g '); mv $ alt "$ new"; fertig – Marlon

+1

Danke! Ich habe die Einzeiler 'mv file_20name.mp4" $ (echo file_20name.mp4 | sed -e 's/_20// g') "' von diesem – ptim

+0

schön abgeleitet, da dies die volle Leistung der sed-Regex-Syntax erlaubt. Eine großartige Kombination von Befehlen und ein guter Prototyp für viele andere Bash-Skripte. – Paul

5

Noch eine andere Lösung ein Werkzeug "mmv" genannt werden würde: mmv "./images/*.png" "./test/#1test.png"

Verwandte Themen