我试图查看NAS上的一堆文件夹,看看它们是否包含某种文件类型,(任何类型的电影,* mpg,avi,mkv等)。 我的脚本/ oneliner看起来像这样,
"find . -maxdepth 1 -mindepth 1 -type d | while read dir; do [[ ! -f "$dir/*.avi" -o -f "$dir/*.mpg" -o -f "$dir/*.mkv" -o -f "$dir/*.iso" ]] && echo "$dir has no moviefile"; done"
但它似乎没有正常工作,它会捕获包含我试图筛选的文件类型的文件夹。我无法检查空文件夹,因为有些文件夹包含jpgs和.nfo文件。几乎每个文件夹中都有150多个子文件夹。
我正在使用某个版本的busybox(BusyBox v1.16.1(2014-12-13 05:30:51 CST))并且它有点瘫痪。
所以,我不想检查没有电影文件的文件夹(1或2深)。子文件夹通常被命名为extrafanart和extrathumbs,但有些文件中包含更多电影,但忽略了这一点,我将以更简单的结构组织它。
答案 0 :(得分:1)
尝试以下操作,检查目录是否找到任何带扩展名的文件,如果找不到,则执行echo语句:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
if [[ -z $(find "$dir" -type f -iname "*.iso" -o -iname "*.mkv" -o -iname "*.avi" *-o -iname "*.mp4"* ) ]]
then
echo "$dir has no moviefile"
fi
done
-z
检查空字符串,所以如果find命令空出来,它将被捕获。
此外,在您的问题中,您指定要检查一个或两个级别的文件,如果是这种情况,则将-maxdepth 1
更改为-maxdepth 2
。
答案 1 :(得分:1)
我将提出一个完全不同的解决方案:将文件夹列表与包含目标文件的文件夹列表进行比较:
diff <(ls -d */) <(ls -d */* | sed -n '/\.\(avi\|mpg\|mkv\|iso\)/s|/[^/]*$|/|p' | sort | uniq)
如果您愿意处理更长的命令以便不会遇到命令行长度限制,则可以使用等效的find命令替换ls -d
命令。
此方法的优点是,如果您要搜索大量文件类型,则只需向列表中添加更多文件类型 - 它不会单独搜索每种类型。
有些怪异的sed
命令