我的音乐收藏量很大,想找到其中仍有未处理的压缩文件 (*.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 文件的目录列表(带有
find
和sort -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)