3

我使用这个命令在当前目录中查找所有包含 .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 行: [[!: command not found

#!/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 行:[!:找不到命令

我认为这与 test 命令的多个参数有关。

由于我正在测试所有目录,因此变量将发生变化,并且我使用通配符作为文件名。

任何帮助深表感谢。谢谢你。

4

3 回答 3

3
[ "$(echo $dir/*.mp3)" = "$dir/*.mp3" ]

应该管用。

或者只是在 '[' 和 '!' 之间添加一个空格

一种可能明显更快的方法是

if find "$dir" -name '*.mp3' -quit ; then
  : # there are mp3-files in there.
else
  ; # no mp3:s
fi
于 2012-10-13T14:07:16.310 回答
1

好的,我通过使用计数器解决了我自己的答案。

我不知道它的效率如何,但它确实有效。我知道它可以做得更好。请随时批评。

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 命令递归地打印目录,它还显示子目录。

于 2012-10-15T16:34:30.747 回答
0

我运行了一个脚本来自动下载我的 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 阻止 find 命令下降到我的 WD My Cloud NAS 服务器为每个专辑创建并放置默认通用光盘映像的隐藏目录。(这在下一次扫描期间被清除。)

编辑: cd 到 MP3 目录并从那里运行它,或者更改 . 在上面的命令中指向指向它的路径。

于 2014-07-30T16:48:26.260 回答