在文件夹中搜索丢失的文件
Search folders for missing files
我正在尝试检查我 NAS 上的一堆文件夹,看看它们是否包含某种文件类型(任何类型的电影、*mpg、avi、mkv 等等)。
我的 script/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"
但它似乎无法正常工作,它会捕获确实包含我要筛选的文件类型的文件夹。而且我无法检查空文件夹,因为有些文件夹包含 jpg 和 .nfo 文件。大约有 150 多个文件夹,几乎每个文件夹都有子文件夹。
我正在使用某个版本的 busybox (BusyBox v1.16.1 (2014-12-13 05:30:51 CST)),它有点残废。
所以,我不想检查其中没有电影文件的文件夹(1 或 2 层)。子文件夹通常命名为extrafanart和extrathumbs,但是有的里面的电影比较多,不过不管这个,我还是整理成一个更简单的结构。
尝试以下,它检查目录是否找到扩展名的任何文件,如果没有找到,则执行 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
。
我将提出一个完全不同的解决方案:将文件夹列表与包含目标文件的文件夹列表进行比较:
diff <(ls -d */) <(ls -d */* | sed -n '/\.\(avi\|mpg\|mkv\|iso\)/s|/[^/]*$|/|p' | sort | uniq)
如果您愿意处理更长的命令以避免可能 运行 进入命令行长度限制,ls -d
命令可以替换为等效的查找命令。
此方法的优点是,如果您要搜索大量文件类型,则只需将更多文件添加到列表中即可 -- 它不会单独搜索每种类型。
有点怪异的sed
命令
- 挑选出包含正确文件扩展名的行并
- 删除文件名(将最后一个斜杠后的所有内容替换为空)
- 打印出结果
我正在尝试检查我 NAS 上的一堆文件夹,看看它们是否包含某种文件类型(任何类型的电影、*mpg、avi、mkv 等等)。 我的 script/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"
但它似乎无法正常工作,它会捕获确实包含我要筛选的文件类型的文件夹。而且我无法检查空文件夹,因为有些文件夹包含 jpg 和 .nfo 文件。大约有 150 多个文件夹,几乎每个文件夹都有子文件夹。
我正在使用某个版本的 busybox (BusyBox v1.16.1 (2014-12-13 05:30:51 CST)),它有点残废。
所以,我不想检查其中没有电影文件的文件夹(1 或 2 层)。子文件夹通常命名为extrafanart和extrathumbs,但是有的里面的电影比较多,不过不管这个,我还是整理成一个更简单的结构。
尝试以下,它检查目录是否找到扩展名的任何文件,如果没有找到,则执行 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
。
我将提出一个完全不同的解决方案:将文件夹列表与包含目标文件的文件夹列表进行比较:
diff <(ls -d */) <(ls -d */* | sed -n '/\.\(avi\|mpg\|mkv\|iso\)/s|/[^/]*$|/|p' | sort | uniq)
如果您愿意处理更长的命令以避免可能 运行 进入命令行长度限制,ls -d
命令可以替换为等效的查找命令。
此方法的优点是,如果您要搜索大量文件类型,则只需将更多文件添加到列表中即可 -- 它不会单独搜索每种类型。
有点怪异的sed
命令
- 挑选出包含正确文件扩展名的行并
- 删除文件名(将最后一个斜杠后的所有内容替换为空)
- 打印出结果