Agregar extensión de archivo a archivos que no tienen extensión

Agregar extensión de archivo a archivos que no tienen extensión

Tengo cientos de archivos en varios subdirectorios diferentes. Algunos de ellos tienen la extensión de archivo correcta, pero otros no. Quiero cambiar el nombre de todos los archivos que no tienen una extensión de archivo y agregar una extensión .mp4 a su nombre de archivo. Los demás archivos no deben modificarse. ¿Cómo puedo automatizar esta operación de cambio de nombre usando Bash? ¿O necesito un lenguaje de programación real como Perl o Python para esto?

Respuesta1

Algo como esto:

find . -type f  ! -name "*.*" -exec mv {} {}.mp4 \;

Respuesta2

Prueba esto:

find -type f -not -name '*.mp4' -exec rename -n 's/$/.mp4/' {} +

Esto busca todos los archivos en el directorio actual y sus subcarpetas que no terminan con .mp4y les cambia el nombre para agregar la extensión.

Asume el comando perlbasado rename, -nla opción es mostrar cómo se cambiará el nombre de los archivos. Una vez que esté de acuerdo, elimine la opción y ejecute el comando nuevamente


Ejemplo:

$ 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)

Si define que un archivo que no tiene extensión significa nombres de archivos sin .su nombre, use:

$ find -type f -not -name '*.*' -exec rename -n 's/$/.mp4/' {} +
rename(./tst, ./tst.mp4)
rename(./abc/123, ./abc/123.mp4)

Respuesta3

manera globstar:

#!/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

forma perl, agregando _2 si el objetivo existe para evitar la sobrescritura

#!/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 $!;
    }
}

Respuesta4

Esto cambiará el nombre de todos los archivos en el directorio actual que NO tienen ya una extensión de archivo.

Ejemplo: su directorio tiene archivos llamados: archivo1, archivo2, archivo3. Se les cambiará el nombre a archivo1.mp4, archivo2.mp4, archivo3.mp4

for file in *; do mv "$file" "${file}.mp4" done

Si hay archivos con un punto que deben excluirse:

for file in *; do [[ $file == *.* ]] && continue mv "$file" "${file}.mp4" done

O con shopt -s extglob:

for file in +([^.]); do mv "$file" "${file}.mp4" done

información relacionada