Mit dem rename
(prename
in einigen Fällen) Skript, das manchmal mit Perl installiert wird, können Sie Perl-Ausdrücke verwenden, um die Umbenennung vorzunehmen. Das Skript überspringt die Umbenennung, wenn es eine Namenskollision gibt.
Der folgende Befehl benennt nur Dateien um, die aus vier oder weniger Ziffern gefolgt von einer „.txt“-Erweiterung bestehen. Dateien, die diesem Muster nicht strikt entsprechen, werden nicht umbenannt. Namen, die aus mehr als vier Ziffern bestehen, werden nicht abgeschnitten.
rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *
Ein paar Beispiele:
Original Becomes
1.txt 0001.txt
02.txt 0002.txt
123.txt 0123.txt
00000.txt 00000.txt
1.23.txt 1.23.txt
Andere bisher gegebene Antworten versuchen, Dateien umzubenennen, die nicht dem Muster entsprechen, Fehler für Dateinamen zu erzeugen, die keine Ziffern enthalten, Umbenennungen durchzuführen, die zu Namenskollisionen führen, versuchen und scheitern, Dateien umzubenennen, die Leerzeichen in ihren Namen haben und möglicherweise andere Probleme.
Einzeiler:
ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv
Wie verwende ich grep, um nur Zeilen zu finden, die \d.txt enthalten (IE 1 Ziffer, dann einen Punkt, dann die Buchstaben txt)?
grep -E '^[0-9]\.txt$'
Versuchen Sie:
for a in [0-9]*.txt; do
mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done
Ändern Sie das Dateinamenmuster ([0-9]*.txt
) nach Bedarf.
Eine allgemeine Aufzählungsumbenennung, die keine Annahmen über den anfänglichen Satz von Dateinamen macht:
X=1;
for i in *.txt; do
mv $i $(printf %04d.%s ${X%.*} ${i##*.})
let X="$X+1"
done
Zum gleichen Thema:
- Bash-Skript zum Auffüllen von Dateinamen
- Dateinamen und Erweiterung in Bash extrahieren
for a in *.txt; do
b=$(printf %04d.txt ${a%.txt})
if [ $a != $b ]; then
mv $a $b
fi
done