2012-10-13 23 views
1

我用这个命令来查找包含在当前目录中的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 

/家庭/用户/箱/ 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号线:[:找不到命令

我在想它必须处理测试命令的多个参数。

由于我正在测试变量将要更改的所有目录,并且我使用通配符作为文件名。

任何帮助,非常感谢。谢谢。

回答

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

应该工作。

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

这可能是显著更快的方法是

if find "$dir" -name '*.mp3' -quit ; then 
    : # there are mp3-files in there. 
else 
    ; # no mp3:s 
fi 
+0

在'['和'!'之间加上一个空格将修复即时错误,但是测试仍然会在具有多个.mp3文件的目录中失败。 'echo'方法效果更好(虽然它仍然可能在包含一个.mp3的目录中以'* .mp3'的确切名称失败)。 –

+0

如果需要测试多个扩展,则查找解决方案也可以更好地扩展。 – perh

+0

谢谢你的回应。我用空格做了修改,但它仍然返回了目录名称,即使里面没有mp3。 –

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命令递归打印目录。

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从降入我的WD我的云NAS服务器已经为每个相册创建并放置一个默认的通用光盘映像一个隐藏目录停止find命令。 (这在下次扫描时被清除。)

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

相关问题