在bash中匹配空格

时间:2011-11-13 21:34:44

标签: bash shell glob

我想删除由itunes制作的重复文件,这些文件都以“1.mp3”结尾。我已接近匹配,但我不知道如何匹配空间。有人可以写一个命令来递归删除当前目录中的那些文件吗?

6 个答案:

答案 0 :(得分:3)

你想浏览你的iTunes收藏并删除Nickelback的如果我关心1.mp3 但是,只有当Nickelback原版MP3,如果我关心.mp3 时,仍然存在。正确?

嘿,你的音乐品味取决于你......

这应该可以解决问题:

find -name "* 1.mp3" | while read file
do
   if [ -e "${file% 1.mp3}.mp3" ]
   then
       rm $file
   fi
done

我找到所有重复项(以space-1.mp3结尾的歌曲)并将它们传递给while语句。

${word%filter}语法表示取$word并从右侧删除glob表达式filter。因此,${file% 1.mp3}是没有1.mp3后缀的文件的名称。现在,If I care 1.mp3变为If I care。因此,我们需要重新添加.mp3后缀。因此${file% 1.mp3}.mp3。这为我们提供了文件的原始名称。

现在,我们使用-e测试来检查该文件是否存在。如果是,我们可以删除歌曲的space-1.mp3版本。

我运行了一些基本测试,但我建议您先尝试一下(可能先将rm $file更改为echo Removing file $file并验证这些文件是否有原始版本。

答案 1 :(得分:2)

听起来像find的工作!

find . -type f -name '* 1.mp3' -print0 | xargs -0 rm 

答案 2 :(得分:1)

与其他解决方案类似,但检查文件没有“1”后缀确实存在,因此不会意外删除名称以“1”结尾的歌曲。

shopt -s globstar
for file in **/*' '1.mp3 ; do
    if [[ -f "${file% 1.mp3}.mp3" ]] ; then
        rm "$file"
    fi
done

答案 3 :(得分:0)

find . -name "* 1.mp3" -exec rm {} \;

答案 4 :(得分:0)

更快:

find . -name "* 1.mp3" -exec rm {} +

答案 5 :(得分:0)

find . -type f -name '* 1.mp3' -print0 | xargs -0 rm
由于-print0和-0的组合,kbyrd提到的是最好的方法,因为。

  

-print0                 真正;在标准输出上打印完整的文件名,然后                 用空字符(而不是换行符)                  - 印刷用途)。这允许包含换行符的文件名或                 其他类型的空白区域可由Pro-正确解释                 处理查找输出的克数。此选项对应于                 xargs的-0选项。