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

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

  1. 搜索影片文件夹中的每个影片,找到它找到的每个文件,获取文件名并尝试在字幕文件夹中搜索它。

  2. 如果找到该文件什么都不做。 如果找不到该文件,请将文件名输出到日志文件,该文件将收集所有没有字幕的电影。

电影文件夹具有以下格式:

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

并且每个movieFolder内部都是实际的电影(每部电影都在Movie文件夹中的自己的文件夹中。

字幕文件夹的所有字幕都在同一个地方。 在字幕文件夹中。

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

电影是MP4MKV格式。 字幕是SRT格式。

如果电影和字幕文件的文件名匹配且只有扩展名不同,则此类内容应该有效。

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

无论电影文件夹结构如何,第二种方式都应该有效,只要文件名相同即可。

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