webentwicklung-frage-antwort-db.com.de

Teil eines Dateinamens umbenennen

Ich habe viele Dateien, die so aussehen:

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

und ich möchte, dass sie so aussehen:

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

Wie kann ich das machen?

81
not_a_geek

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

rename ABC XYZ *.dat

Möglicherweise haben Sie eine Version, die einen Perl-Regex unterstützt.

rename 's/ABC/XYZ/' *.dat
154
Paul Dixon
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done

Kein rename oder sed erforderlich. Nur bash Parametererweiterung .

101
RJ Alten

So etwas wird es schaffen. 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 diese Skripte übrigens immer an Kopien Ihrer Daten und in völlig anderen Verzeichnissen testen.

7
paxdiablo

Sie müssen lernen, sed zu verwenden. Http://unixhelp.ed.ac.uk/CGI/man-cgi?sed

Und auch für die Verwendung, so können Sie Ihre Dateieinträge durchlaufen http://www.cyberciti.biz/faq/bash-for-loop/

Ihr Befehl sieht ungefähr so ​​aus. Ich habe keinen Begriff neben mir und kann ihn nicht überprüfen

for i in `dir` do mv $i `echo $i | sed '/orig/new/g'`
4
Stephen Lacy

Alle diese Antworten sind einfach und gut. Ich mag es jedoch immer, diesen Skripten einen interaktiven Modus hinzuzufügen, damit ich falsch positive Ergebnisse finde.

if [[-n $ inInteractiveMode]]
dann
Echo -e -n "$ oldFileName => $ newFileName\nMöchten Sie diese Änderung vornehmen? [Y/n]:"
Leselauf

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

Oder machen Sie den interaktiven Modus zum Standard und fügen Sie ein Force-Flag (-f | --force) für automatisierte Skripte hinzu, oder wenn Sie sich trauen. Und das verlangsamt Sie nicht zu sehr: Die Standardantwort lautet "Ja, ich möchte umbenennen", sodass Sie bei jeder Eingabeaufforderung einfach die Eingabetaste drücken können (wegen des `` -z $ run\ Prüfung.

1
Sam Bisbee

Ich mache das gerne mit sed. In deinem 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

Es ist am besten, zuerst den Teil "sh -e" wegzulassen, um zu sehen, was ausgeführt wird.

1
stribika