搜索文件夹中缺少的文件

时间:2015-01-21 16:18:12

标签: bash file

我试图查看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,但有些文件中包含更多电影,但忽略了这一点,我将以更简单的结构组织它。

2 个答案:

答案 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命令

  1. 选出包含正确文件扩展名和
  2. 的行
  3. 删除文件名(替换最后一个斜杠之后的所有内容)
  4. 打印出结果