Adicione extensão de arquivo a arquivos que não possuem extensão

Adicione extensão de arquivo a arquivos que não possuem extensão

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 .mp4e os renomeia para adicionar a extensão

Assume comando perlbaseado , 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

informação relacionada