这是一个棘手的问题。我需要使用 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
,其中包含没有字幕的电影的名称。