查找不包含某个文件但包含另一个文件的目录

查找不包含某个文件但包含另一个文件的目录

我的音乐收藏量很大,想找到其中仍有未处理的压缩文件 (*.rar) 的目录。因此,寻找一个命令,列出其中没有 *.flac 或 *.mp3 但有 *.rar 的目录。根据此帖子中找到的示例进行操作:

我试过:

comm -3 \
    <(find ~/Music/ -iname "*.rar" -not -iname "*.flac" -not -iname "*.mp3" -printf '%h\n' | sort -u) \
    <(find ~/Music/ -maxdepth 5 -mindepth 2 -type d | sort) \
| sed 's/^.*Music\///'

但不工作。

答案1

以下命令将列出所有不包含.flac.mp3文件的目录:

find ~/Music -type d '!' -exec sh -c 'ls -1 "{}"|egrep -iq "^*\.(flac|mp3)$" ' ';' -print

以下命令将列出所有包含.rar文件的目录:

find ~/Music -type d -exec sh -c 'ls -1 "{}"|egrep -iq "^*\.rar$"' ';' -print

现在,加入这些命令,以下命令将列出所有不包含.flac.mp3文件并且包含.rar文件的目录:

find ~/Music -type d -exec sh -c 'ls -1 "{}"|egrep -iq "^*\.rar$"' ';' \
    '!' -exec sh -c 'ls -1 "{}"|egrep -iq "^*\.(mp3|flac)$" ' ';' -print

答案2

我的建议:

find . -iname '*.rar' -exec bash -c 'cd "${1%/*}"; 
  shopt -s nullglob; files=(*.flac *.mp3); 
  ((${#files[@]} == 0)) && echo "$1"' _ {} \;

解释:对于每个 .rar,获取其基本目录,列出 *.flac 和 *.mp3,如果列表为空,则打印文件名。

答案3

可能有更优雅的方式来做到这一点,但我天真地想

  • 获取包含 *.rar 文件的目录列表(带有findsort -u
  • 获取包含 *.mp3 和 *.flac 文件的目录列表(也带有find
  • 从第一个列表中减去第二个列表(使用grep -v

所以:

find . -iname '*.rar' -printf '%h\n' | sort -u > lista.txt
find . -iregex '.*\(.mp3\|.flac\)' -printf '%h\n' | sort -u > listb.txt
grep -v -f listb.txt lista.txt

您可以使用进程替换来完成此操作,而不必使用临时文件,就像您在问题中尝试的那样:

grep -v -f <(find . -iregex '.*\(.mp3\|.flac\)' -printf '%h\n' | sort -u) \
<(find . -iname '*.rar' -printf '%h\n' | sort -u)

相关内容