Tenho centenas de arquivos em vários subdiretórios diferentes. Alguns deles têm a extensão de arquivo correta, mas outros não. Quero renomear todos os arquivos que não possuem uma extensão de arquivo e acrescentar uma extensão .mp4 ao nome do arquivo. Os outros arquivos devem permanecer intactos. Como posso automatizar essa operação de renomeação usando Bash? Ou preciso de uma linguagem de script real como Perl ou Python para isso?
Responder1
Algo assim:
find . -type f ! -name "*.*" -exec mv {} {}.mp4 \;
Responder2
Experimente isto:
find -type f -not -name '*.mp4' -exec rename -n 's/$/.mp4/' {} +
Isso verifica todos os arquivos no diretório atual e suas subpastas que não terminam com .mp4
e os renomeia para adicionar a extensão
Assume comando perl
baseado , a opção é mostrar como os arquivos serão renomeados. Quando estiver tudo bem, remova a opção e execute o comando novamenterename
-n
Exemplo:
$ 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)
Se você definir arquivo sem extensão como nomes de arquivos sem .
nome, use:
$ find -type f -not -name '*.*' -exec rename -n 's/$/.mp4/' {} +
rename(./tst, ./tst.mp4)
rename(./abc/123, ./abc/123.mp4)
Responder3
maneira 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
maneira perl, adicionando _2 se o destino existir para evitar substituição
#!/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 $!;
}
}
Responder4
Isso renomeará todos os arquivos no diretório atual que ainda NÃO possuem uma extensão de arquivo.
Exemplo: seu diretório possui arquivos chamados: arquivo1, arquivo2, arquivo3. Eles serão renomeados para arquivo1.mp4, arquivo2.mp4, arquivo3.mp4
for file in *; do mv "$file" "${file}.mp4" done
Se houver arquivos com ponto que devem ser excluídos:
for file in *; do [[ $file == *.* ]] && continue mv "$file" "${file}.mp4" done
Ou com shopt -s extglob:
for file in +([^.]); do mv "$file" "${file}.mp4" done