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 .mp4
y les cambia el nombre para agregar la extensión.
Asume el comando perl
basado rename
, -n
la 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