递归比较两个目录之间的特定文件的数量

递归比较两个目录之间的特定文件的数量

我找了又找,但没有找到这个问题的答案。

场景如下:我刚刚将我的整个 CD 收藏翻录为免费无损音频编解码器 (FLAC) 进行存档。我的存档中还有一些高质量的有损 .m4a 或 .mp3。这些文件存储在 DIRECTORY01/artist - album/*.flac 结构中。此目录中的所有相关文件都是 .flac、.m4a 或 .mp3

然后我将整个目录转码为 ogg vorbis,以供日常使用和我的便携式媒体播放器使用。它存储在 DIRECTORY02/artist - album/*.ogg 结构中。所有相关文件都是 .ogg。

现在我想验证一切是否正常。我使用 diff 比较文件夹的数量(并验证它们是否相同。然后我分别计算了每个文件夹中 flac 和 ogg 文件的数量。

问题:.ogg 文件夹中不知何故多出了三个 .ogg 文件。由于每个父目录包含 526 个子文件夹,我想知道如何自动识别仅在特定 .ogg 或 .flac/.m4a/.mp3 文件类型的文件数量上有所不同的目录(忽略任何 .txt、.log、.nfo、.cue、.jpg 等)。

因此理想情况下,无论我运行什么命令,结果都会是一份报告,该报告会忽略具有常见文件数的常见子目录,并帮助我具体识别具有不同“.ogg 或 .flac/.m4a/.mp3”文件数的任何目录。

这可能吗?我还愿意接受其他建议/逻辑来验证所有 X 个 .flac/.m4a/.mp3 是否成功转码为 .ogg。

答案1

由于您有超过.ogg.flac一个简单的方法是查找所有*.ogg名称并检查哪些名称没有对应的.flac名称。例如:

find DIRECTORY02/ -type f -name '*ogg' -print0 | 
    while IFS= read -r -d '' f; do 
        flac="${f//.ogg/.flac}"; 
        flac="${flac##DIRECTORY02/}"; 
        [[ -e DIRECTORY01/"$flac" ]] || 
            printf "Missing file: %s\n" "$flac"; 
done

这与注释脚本相同:

#!/bin/bash

## find all files in DIRECTORY02/ whose name ends in .ogg
find DIRECTORY02/ -type f -name '*.ogg' -print0 | 
    ## Iterate over the results of the find command, saving
    ## each file as "$f". The fancy -print0 and read -d '' stuff
    ## is needed to deal with filenames that can contain newlines.
    while IFS= read -r -d '' f; do 
        ## create the new $flac variable which is $f but with ".flac"
        ## instead of ".ogg"
        flac="${f//.ogg/.flac}"; 
        ## remove the "DIRECTORY02/" from the $flac variable. If
        ## the "$f" variable was 'DIRECTORY02/artist - album/file.ogg'
        ## it is now 'artist - album/file.flac'.
        flac="${flac##DIRECTORY02/}"; 
        ## Check whether the file exists in the same subdirectory under
        ## DIRECTORY01
        [[ -e DIRECTORY01/"$flac" ]] || 
            ## If it doesn't, print
            printf "Missing file: %s\n" "$flac"; 
done

答案2

使用for循环find,这可能不是实现目标的最快方法,但应该可以正常工作:

for dir in DIRECTORY01/*/ ; do fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c) ; ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c); if [[ "$fcount" -ne "$ocount" ]]; then echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files" ; fi ; done

或者更易读

for dir in DIRECTORY01/*/ ; do
  fcount=$(find "$dir" -maxdepth 1 -type f \( -name '*.flac' -o -name '*.m4a' -o -name '*.mp3' \) -printf . | wc -c)
  ocount=$(find "${dir/DIRECTORY01/DIRECTORY02}" -maxdepth 1 -type f -name '*.ogg' -printf . | wc -c)
  if [[ "$fcount" -ne "$ocount" ]]; then
    echo "$dir has $fcount .flac .m4a and .mp3 files but ${dir/DIRECTORY01/DIRECTORY02} has $ocount .ogg files"
  fi
done

将输出类似以下内容:

DIRECTORY01/Nirvana - Nevermind/ has 12 .flac files but DIRECTORY02/Nirvana - Nevermind/ has 11 .ogg files

对于文件计数不匹配的每个目录。循环无法妥善处理错误情况,例如“艺术家 - 专辑”目录出现在 DIRECTORY01 中,但未出现在 DIRECTORY02 中,或者“专辑 - 艺术家”目录的拼写存在差异。

答案3

您可以尝试使用meld。描述如下:

Meld 是一款适用于 GNOME 桌面的图形化差异查看器和合并应用程序。它支持 2 和 3 个文件差异、递归目录差异、版本控制下的目录差异(Bazaar、Codeville、CVS、Darcs、Fossil SCM、Git、Mercurial、Monotone、Subversion),以及手动和自动合并文件差异的功能。

1)网站是:

http://meldmerge.org/

2)如果它在你的存储库列表中,你可以使用以下命令安装它:

sudo apt-get update
sudo apt-get install meld

3)它也位于 Ubuntu 软件应用程序中。

相关内容