Encontre arquivos com o mesmo nome em pastas diferentes

2

Este é um truque. Eu preciso fazer o seguinte usando 2 pastas, a pasta de filmes e a pasta de legendas:

  1. Pesquise todos os filmes dentro da pasta do filme, para cada arquivo que encontrar, pegue o nome do arquivo e tente procurá-lo na pasta de legendas.

  2. Se o arquivo for encontrado, não faça nada. Se o arquivo não for encontrado, envie o nome do arquivo para um arquivo de registro que coletará todos os filmes que não possuem legenda.

A pasta de filmes tem o seguinte formato:

/ Filmes
/ Movies / SomeMovieFolder1
/ Filmes / SomeMovieFolder2
/ Filmes / SomeMovieFolder3
/ Filmes / SomeMovieFolder ...
/ Movies / SomeMovieFolderN

E dentro de cada filmeFolder é o filme real (cada filme está em sua própria pasta dentro da pasta Filme.

A pasta de legendas tem todas as legendas no mesmo lugar. Na pasta de legendas.

Meu pensamento seria de 2 find comandos em loop usando um tempo. Isso seria um script de shell (bash).

Os filmes são formatos MP4 ou MKV . As legendas estão no formato SRT .

    
por Luis Alvarado 05.05.2013 / 18:12

2 respostas

5

Se os nomes de arquivo dos arquivos de filmes e legendas coincidirem e somente as extensões forem diferentes, algo assim deve funcionar.

#!/bin/bash

movie_dir=~/Movies
subtitle_dir=~/Subtitles
log=~/log.txt

for i in "$movie_dir"/*;do
    filname="${i%.*}"
    if [ ! -e "$subtitle_dir/$filename.srt" ];then
        echo "$filename" >> "$log"
    fi
done

EDITAR Para quando cada arquivo de filme estiver em sua própria pasta, tente:

#!/bin/bash

movie_dir=~/Movies
subtitle_dir=~/Subtitles
log=~/log.txt

find "$movie_dir" -type f -name "*.mp4" -o -name "*.mkv" | while read i;do
    filename="$(basename "${i%.*}")"
    if [ ! -e "$subtitle_dir/$filename.srt" ];then
        echo "$filename" >> "$log"
    fi
done

Esse segundo caminho deve funcionar independentemente da estrutura da pasta do filme, novamente, contanto que os nomes dos arquivos sejam os mesmos.

    
por Stump 05.05.2013 / 19:03
3
#!/usr/bin/perl -w
use strict;
use File::Find;
use File::Basename qw( basename );

my $movies_dir = "/home/user/movies";
my $subs_dir = "/home/user/subs";
my $log = "./movie-log";

my %options;
my %subs = map { basename($_) =~ s/\.[^.]+$//r, 1 } <$subs_dir/*>;
open LOG, '>>', $log or die "Can't open $log: $!\n";

$options{wanted} = sub {
    my $movie = s/\.[^.]+$//r;
    if ( -f && /\A.*\.(mp4|mkv)\z/i ) {
        exists $subs{$movie} or
        print LOG "$_\n";
    }
};

$options{preprocess} = sub {
    sort @_;
};

find (\%options, $movies_dir);
__END__

O script criará um arquivo de log chamado movie-log no diretório atual, contendo os nomes dos filmes que não possuem legendas.

    
por Basharat Sialvi 05.05.2013 / 20:14

Tags