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?
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
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done
Kein rename
oder sed
erforderlich. Nur bash Parametererweiterung .
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.
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'`
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.
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.