我使用此命令查找当前目录中包含.mp3的所有目录,并仅过滤掉目录名称:
find . -iname "*.mp3" | sed -e 's!/[^/]*$!!' -e 's!^./!!' | sort -u
我现在想要相反的东西,但我发现它有点难。我不能只在 find 命令中添加"!",因为它只会在打印它们时排除.mp3,找不到不包含.mp3的目录。
我用谷歌搜索了这个,并在stackoverflow和 unix.stackexchange.com 上搜索。到目前为止,我已经尝试了这个脚本,它返回此错误:
#!/bin/bash
find . -type d | while read dir
do
if [[! -f $dir/*.mp3 ]]
then
echo $dir
fi
done
/home/user/bin/try.sh:第 5 行:[[!:找不到命令
#!/bin/bash
find . -type d | while read dir
do
if [! -f $dir/*.mp3 ]
then
echo $dir
fi
done
/home/user/bin/try.sh: 第 5 行: [!: 找不到命令
#!/bin/bash
find . -type d | while read dir
do
if [[! -f "$dir/*.mp3" ]]
then
echo $dir
fi
done
/home/user/bin/try.sh: 第 5 行: [!: 找不到命令
我认为这与测试命令的多个参数有关。
由于我正在测试所有目录,因此变量将更改,并且我对文件名使用通配符。
任何帮助都非常感谢。 谢谢。
[ "$(echo $dir/*.mp3)" = "$dir/*.mp3" ]
应该工作。
或者干脆在"["和"!"之间添加一个空格
一种可能明显更快的方法是
if find "$dir" -name '*.mp3' -quit ; then
: # there are mp3-files in there.
else
; # no mp3:s
fi
好的,我使用计数器解决了自己的答案。
我不知道它的效率如何,但它有效。 我知道它可以做得更好。请随时批评。
find . -type d | while read dir
do
count=`ls -1 "$dir"/*.mp3 2>/dev/null | wc -l`
if [ $count = 0 ]
then
echo $dir
fi
done
这将打印所有不包含 MP3 的目录 它还显示子目录,这要归功于 find 命令递归打印目录。
我运行了一个脚本来自动下载我的 mp3 收藏的封面。它将一个名为"cover.jpg"的文件放在每个专辑的目录中,它可以检索其艺术。 我需要检查脚本失败的专辑 - 即哪些 CD(目录)不包含名为 cover.jpg 的文件。这是我的努力:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do [[ ! -f $dir/cover.jpg ]] && echo "$dir has no cover art"; done
maxdepth 1 阻止查找命令下降到我的 WD My Cloud NAS 服务器为每个相册创建的隐藏目录,并放置默认的通用光盘映像。(这在下次扫描期间被清除。
编辑:cd 到 MP3 目录并从那里运行它,或将上面的命令中的 . 更改为指向它的路径。