Ich habe Hunderte von Dateien in verschiedenen Unterverzeichnissen. Manche davon haben die richtige Dateiendung, manche aber nicht. Ich möchte alle Dateien, die keine Dateiendung haben, umbenennen und die Endung .mp4 an ihren Dateinamen anhängen. Die anderen Dateien sollen unberührt bleiben. Wie kann ich diesen Umbenennungsvorgang mit Bash automatisieren? Oder brauche ich dafür eine richtige Skriptsprache wie Perl oder Python?
Antwort1
Etwas wie das:
find . -type f ! -name "*.*" -exec mv {} {}.mp4 \;
Antwort2
Versuche dies:
find -type f -not -name '*.mp4' -exec rename -n 's/$/.mp4/' {} +
Dies prüft alle Dateien im aktuellen Verzeichnis und seinen Unterordnern, die nicht mit enden .mp4
und benennt sie um, um die Erweiterung hinzuzufügen
Nimmt einen perl
befehlsbasierten rename
Befehl an, -n
die Option zeigt an, wie die Dateien umbenannt werden. Wenn Sie damit einverstanden sind, entfernen Sie die Option und führen Sie den Befehl erneut aus
Beispiel:
$ find -type f
./rand_numbers.txt
./tst
./abc/123
./abc/zyx.txt
$ find -type f -not -name '*.mp4' -exec rename -n 's/$/.mp4/' {} +
rename(./rand_numbers.txt, ./rand_numbers.txt.mp4)
rename(./tst, ./tst.mp4)
rename(./abc/123, ./abc/123.mp4)
rename(./abc/zyx.txt, ./abc/zyx.txt.mp4)
Wenn Sie für die Definition von „Dateien ohne Erweiterung“ Dateinamen ohne Erweiterung .
im Namen meinen, verwenden Sie:
$ find -type f -not -name '*.*' -exec rename -n 's/$/.mp4/' {} +
rename(./tst, ./tst.mp4)
rename(./abc/123, ./abc/123.mp4)
Antwort3
Globstar-Weg:
#!/bin/bash
# Warning: globstar excludes hidden directories.
# Turn on recursive globbing (in this script) or exit if the option is not supported:
shopt -s globstar || exit
for f in **; do
if [ -f "$f" ]; then
case "${f##*/}" in
*.*) continue ;;
esac
mv "$f" "$f".mp4;
fi
done
Perl-Weg, Hinzufügen von _2, wenn das Ziel existiert, um ein Überschreiben zu vermeiden
#!/usr/bin/perl
use warnings;
use strict;
use File::Find;
find(\&rout, ".");
sub rout {
next if -d $_;
my $new_name = $_;
$new_name =~ s/^([^.]+)$/$1.mp4/;
chdir($File::Find::dir);
if(-e $new_name){
my $new_name2 = $_;
$new_name2 =~ s/^([^.]+)$/$1\_2.mp4/;
rename($_, $new_name2) or die $!;
} else {
$new_name =~ s/^([^.]+)$/$1.mp4/;
rename($_, $new_name) or die $!;
}
}
Antwort4
Dadurch werden alle Dateien im aktuellen Verzeichnis umbenannt, die noch KEINE Dateierweiterung haben.
Beispiel: Ihr Verzeichnis enthält Dateien mit den Namen: file1, file2, file3. Sie werden in file1.mp4, file2.mp4, file3.mp4 umbenannt.
for file in *; do mv "$file" "${file}.mp4" done
Wenn es Dateien mit einem Punkt gibt, die ausgeschlossen werden müssen:
for file in *; do [[ $file == *.* ]] && continue mv "$file" "${file}.mp4" done
Oder mit shopt -s extglob:
for file in +([^.]); do mv "$file" "${file}.mp4" done