Найти файлы с одинаковыми именами в разных папках

Это сложно. Мне нужно сделать следующее, используя 2 папки, папку с фильмами и папку с субтитрами:

  1. Поиск каждого фильма в папке фильма, для каждого найденного файла, захват имени файла и попробуйте найти его в папке субтитров.

  2. Если файл найден, ничего не делать. Если файл не найден, выведите имя файла в файл журнала, который соберет все фильмы без субтитров.

Папка фильма имеет следующий формат:

/ Фильмы
/ Фильмы / SomeMovieFolder1
/ Фильмы / SomeMovieFolder2
/ Фильмы / SomeMovieFolder3
/Movies/SomeMovieFolder…
/ Movies / SomeMovieFolderN

И внутри каждого movieFolder находится фактический фильм (Каждый фильм находится в отдельной папке внутри папки Movie.

Папка субтитров содержит все субтитры в одном месте. В папка с субтитрами.

Мое мышление было бы 2 find командами, зацикленными вместе, используя время. Это был бы сценарий оболочки (bash).

Фильмы - MP4 или MKV форматы. Субтитры имеют формат SRT .

2
задан 5 May 2013 в 21:31

2 ответа

Если имена файлов фильмов и субтитров совпадают, и отличаются только расширения, должно сработать что-то подобное.

#!/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

РЕДАКТИРОВАТЬ Если каждый файл фильма находится в отдельной папке, попробуйте:

#!/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

Этот второй способ должен работать независимо от структуры папки фильма, опять же, пока так как имена файлов совпадают.

0
ответ дан 5 May 2013 в 21:31
#!/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__

Сценарий создаст названный файл журнала movie-log в текущем каталоге, содержа названия фильмов, который не имеет подзаголовков.

3
ответ дан 5 May 2013 в 21:31

Другие вопросы по тегам:

Похожие вопросы: