在不同文件夹中查找同名的文件

在不同文件夹中查找同名的文件

这是一个棘手的问题。我需要使用 2 个文件夹(电影文件夹和字幕文件夹)执行以下操作:

  1. 搜索电影文件夹内的每一部电影,对于找到的每个文件,获取文件名并尝试在字幕文件夹中搜索它。

  2. 如果找到文件,则不执行任何操作。如果未找到文件,则将文件名输出到日志文件,该文件将收集所有没有字幕的电影。

电影文件夹的格式如下:

/电影
/电影/SomeMovieFolder1
/电影/SomeMovieFolder2
/电影/SomeMovieFolder3
/电影/SomeMovieFolder...
/电影/SomeMovieFolderN

每个 movieFolder 里面都有实际的电影(每个电影都在 Movie 文件夹内它自己的文件夹中。

字幕文件夹的所有字幕都位于同一位置。在字幕文件夹中。

我的想法是find使用while循环将2个命令放在一起。这将是一个shell脚本(bash)。

电影是MP4或者美军格式。字幕是固体废物管理格式。

答案1

如果电影和字幕文件的文件名匹配,并且只有扩展名不同,那么这样的操作应该可以起作用。

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

无论电影文件夹结构如何,只要文件名相同,第二种方法就可以起作用。

答案2

#!/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,其中包含没有字幕的电影的名称。

相关内容