Fügen Sie Dateien ohne Erweiterung eine Dateierweiterung hinzu

Fügen Sie Dateien ohne Erweiterung eine Dateierweiterung hinzu

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 .mp4und benennt sie um, um die Erweiterung hinzuzufügen

Nimmt einen perlbefehlsbasierten renameBefehl an, -ndie 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

verwandte Informationen