Ich habe einige Dateien wie:
20150716_something-here
20150716_something-heretoo
20150716_something-hereaswell
Sie müssen umbenannt werden in
2015-07-16_something-here
2015-07-16_something-heretoo
2015-07-16_something-hereaswell
Ich habe versucht, mit einemPerl-Implementierungdesrename
Befehl(siehe meinen Kommentar zur akzeptierten Antwort), aber ich war nicht erfolgreich.
Antwort1
Verwenden der integrierten Teilzeichenfolgenerweiterung von Bash:
for f in 2015* ; do
mv "$f" "${f::4}-${f:4:2}-${f:6}"
done
Antwort2
Mit sed
:
LC_ALL=C sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1_\2_\3/' <file
Antwort3
Obwohl rename
es ein sehr mächtiges Werkzeug ist, bevorzuge ich normalerweise die Einfachheit desmmv
(Mehrfachbewegung) Dienstprogramm:
mmv '????????_*' '#1#2#3#4-#5#6-#7#8_#9'
Das ?
im Suchmuster steht für ein einzelnes Zeichen, das *
für eine beliebig lange Zeichenfolge. Im Ersetzungsmuster #<number>
steht jedes für ein entsprechendes ?
oder *
im Suchmuster. Zusätzlich zu ?
und werden *
auch mmv
Zeichenbereiche innerhalb von Klammern unterstützt (wie [a-f]
).
( mmv
testet vor Arbeitsbeginn auf etwaige Konflikte beim Umbenennen, sodass Sie nicht riskieren, Dateien durch Überschreiben zu verlieren.)
Antwort4
Auf meiner Distribution habe ich den perl-rename
Befehl, der einen regulären Ausdruck im Perl-Stil verwenden kann, um Dateien massenhaft umzubenennen. Der rename
Befehl akzeptiert für die Umbenennung nur ein Paar fester Zeichenfolgen.