Hier ist eine Art und Weise:
for f in *.txt; do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
Zwischen dem do
und done
, ist es bei einer Datei zu einem Zeitpunkt suchen, und der Name der aktuellen Datei im Paramter f
. "$f"
ist der Wert dieses Parameters, unverändert. "${f/[0-9][0-9][0-9].txt/.txt}"
ist der Wert des Parameters, für den eine Substitution angewendet wurde: ersetzen Sie "drei Ziffern gefolgt von .txt
" mit nur .txt
.
Wie @anubhava wies darauf hin, wenn Sie es ausführen mehr als einmal es lopping Ziffern aus den Dateinamen zu halten, so tun das nicht. Sie können es idempotent machen, indem Sie das Glob-Muster straffen. Dies ist ein wenig sperrig:
for f in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].txt; do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
So könnten Sie ein externes Tool verwenden, um es kompakter zu machen (dies setzt voraus, es gibt keine Leerzeichen oder Zeilenumbrüche in beliebigen Dateinamen im Verzeichnis):
for f in $(ls -1 | egrep '^[0-9]{13}\.txt$'); do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
Sie können die Beschränkung auf nur „ohne Zeilenumbrüche“ reduzieren, indem eine while read
Schleife:
ls -1 | egrep '^[0-9]{13}\.txt$' | while read f; do
mv "$f" "${f/[0-9][0-9][0-9].txt/.txt}"
done
A auf bash Version hängt Failsafe Python Alternative, die rekursiv funktioniert: http://Stackoverflow.com/a/39698169/191246 – ccpizza