Adicionar extensão de arquivo a arquivos sem extensão

1

Eu tenho centenas de arquivos em vários subdiretórios diferentes. Alguns deles têm a extensão de arquivo correta, mas alguns deles não. Eu quero renomear todos os arquivos que não têm uma extensão de arquivo e acrescentar uma extensão .mp4 ao nome do arquivo. Os outros arquivos devem permanecer intocados. Como posso automatizar essa operação de renomeação usando o Bash? Ou eu preciso de uma linguagem de script real como Perl ou Python para isso?

    
por ThoWe 02.10.2016 / 17:21

3 respostas

6

Algo parecido com isto:

find . -type f  ! -name "*.*" -exec mv {} {}.mp4 \;
    
por 02.10.2016 / 17:40
2

Tente 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 o comando perl based rename , a opção -n serve para mostrar como os arquivos serão renomeados. Uma vez que você está bem com isso, remova a opção e execute o comando novamente


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 o arquivo sem extensão para significar nomes de arquivo sem . em seu nome, use:

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

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

perl way, adicionando _2 se o alvo existir para evitar sobrescrever

#!/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 $!;
    }
}
    
por 02.12.2017 / 05:48