2009-09-08 18 views
61

Entschuldigung für die richtig dumme Frage, aber ich bin ein ziemlich Neuling. Ich habe viele Dateien, die wie folgt aussehen:Teil des Dateinamens umbenennen

DET01-ABC-5_50-001.dat 
... 
DET01-ABC-5_50-0025.dat 

und ich möchte, dass sie wie folgt aussehen:

DET01-XYZ-5_50-001.dat 
... 
DET01-XYZ-5_50-0025.dat 

, wie ich dies tun kann? Ich habe mehrere Dinge aus diesem Forum versucht, aber ich scheine einen Fehler zu machen. Danke für Ihre Hilfe!

Antwort

123

Es gibt ein paar Varianten eines Umbenennungs Befehl, in Ihrem Fall kann es so einfach sein wie

rename ABC XYZ *.dat 

Sie können eine Version haben, die eine Perl regex nimmt;

rename 's/ABC/XYZ/' *.dat 
+0

+1 der einfachste weg – rangalo

+0

danke eine million! Das war einfach (wenn Sie wissen wie ;-)) –

+2

Willkommen bei stackoverflow! –

1

Ich mag dies mit Sed zu tun. In Ihrem Fall:

for x in DET01-*.dat; do 
    echo $x | sed -r 's/DET01-ABC-(.+)\.dat/mv -v "\0" "DET01-XYZ-\1.dat"/' 
done | sh -e 

Am besten ist es, den „sh -e“ Teil wegzulassen zuerst zu sehen, was ausgeführt wird.

+0

vielleicht mache ich etwas falsch, aber das tut nichts zu meinen Akten? –

+0

Versuchen Sie mit oder ohne "sh -e"? Wenn du es versuchst ohne es nicht soll. Es gibt nur aus, was ausgeführt wird ("mv -v ... ..." Zeilen), um zu prüfen, ob alles in Ordnung ist. Wenn dir gefällt, was du siehst, füge das "sh -e" hinzu. – stribika

6

So etwas wird es tun. Die for-Schleife muss möglicherweise geändert werden, je nachdem, welche Dateinamen Sie erfassen möchten.

for fspec1 in DET01-ABC-5_50-*.dat ; do 
    fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/') 
    mv ${fspec1} ${fspec2} 
done 

Sie sollten immer diese Skripte auf Kopien Ihre Daten testen, durch die Art und Weise, und in ganz anderen Verzeichnissen.

+0

für osx das Zeug verwenden. rename sieht cool aus, aber eine brew-installation von rename scheint ein perl-script zu installieren, das im obigen beispiel nicht funktionierte. Einiges googlen zeigte an, dass das Umbenennen nicht für alle Linux-Vars verfügbar ist und dass tatsächlich eine Perl-Version verfügbar ist. Ich habe ungefähr 10 Minuten gebraucht, um die Unterschiede zu klären und beschließe - du weißt, dass diese Antwort einfach genug ist :). – j03m

1

Alle diese Antworten sind einfach und gut. Ich möchte diesen Skripts jedoch immer einen interaktiven Modus hinzufügen, damit ich falsche Positive finden kann.

if [[-n $ inInteractiveMode]]
dann
    echo -e -n "$ oldFileName => $ newFileName \ nMöchten Sie diese Änderung tun [Y/n]?"
    Lese laufen

    [[-z $ laufen || "$ run" == "y" || "$ Run" == "Y"]] & & mv "$ oldFileName" "$ newFileName"
fi

oder im interaktiven Modus macht die Standard-und fügen Sie einen Kraft-Flag (-f | --force) für automatisierte Skripte oder wenn Sie sich wagemutig fühlen. Und das verlangsamt Sie nicht zu sehr: Die Standardantwort ist "Ja, ich möchte umbenennen", so dass Sie einfach die Eingabetaste an jeder Eingabeaufforderung drücken können (wegen des `-z $ ​​run \ Tests.

77
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done 

Kein rename oder sed benötigt. Einfach bash parameter expansion.

+5

Wenn Dateinamen Leerzeichen enthalten, sollten Sie Zitat verwenden. Siehe Ausschnitt unten ... 'für Datei in * .dat; do mv "$ file" "$ {Datei // ABC/XYZ}"; done' –

+0

Funktioniert gut auf OSX –

Verwandte Themen