Ich erhalte Videodateien mit unterschiedlichen Namen, aber die letzten 8 Zeichen sind Zahlen (auch jedes Mal anders). Dies ist das Muster des Dateinamens:
custom text 00030402.avi
Ich muss dafür sorgen, dass der Dateiname folgendermaßen aussieht:
00\:03\:04\:02
Meine Frage ist also, wie ich die letzten 8 Zeichen umbenennen und beibehalten kann, um dieses Muster zu erreichen.
Antwort1
Verwenden von rename
(das von ), das perl
manchmal auch prename
, nicht von genannt wird util-linux
):
rename 's/(\d{2})(\d{2})(\d{2})(\d{2})/$1:$2:$3:$4/' *.avi
custom text 00030402.avi
Dadurch würde ein Dateiname beispielsweise in umbenannt custom text 00:03:04:02.avi
.
Wenn Sie Backslashes im Dateinamen (vor dem :
) haben, sagen Sie:
rename 's/(\d{2})(\d{2})(\d{2})(\d{2})/$1\\:$2\\:$3\\:$4/' *.avi
Um den benutzerdefinierten Text aus den Dateinamen zu entfernen, sagen Sie:
rename 's/.* (\d{2})(\d{2})(\d{2})(\d{2})(.*)/$1\\:$2\\:$3\\:$4$5/' *.avi
Antwort2
Mit zsh
:
$ autoload zmv
$ zmv -v '(*)(??)(??)(??).avi' '$1\:$2\:$3\:$4.avi'
mv -- custom\ text\ 00030402.avi custom\ text\ 00\\:03\\:04\\:02.avi
(-v für ausführlich). Zum Entfernen derbenutzerdefinierter Text:
$ zmv -v '*(??)(??)(??)(??).avi' '$1\:$2\:$3\:$4.avi'
mv -- custom\ text\ 00030402.avi 00\\:03\\:04\\:02.avi
Antwort3
So geht das mit der Perl-Regex-Lookahead-Funktion:
perl -e '
while($name=shift){
@components = split /(?=(?:[0-9]{2})+[^0-9]+$)/,$name;
shift @components;
$new_name = join '\:',@components;
rename $name => $new_name;
}
' list_of_avi_files
Dies funktioniert für jede beliebige Anzahl Ziffernpaare, nicht nur für 4. Sie können es beispielsweise auch {2}
in ändern {3}
und in Zifferndreiergruppen aufteilen.