2011-11-13 44 views
1

我想删除由iTunes创建的重复文件,这些文件都以“1.mp3”结尾。我已经接近匹配,但我不知道如何匹配空间。有人可以写一个命令递归地从当前目录中删除这些文件吗?在bash中匹配空格

回答

3

你想通过你的iTunes音乐收藏,并删除Nickelback的如果我不在乎1.MP3但是,只有当Nickelback乐队原MP3,如果我care.mp3,依然存在。对?

嘿,你的音乐品味是由你...

这应该做的伎俩:

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

我发现所有(在空间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 $fileecho Removing file $file并验证这些文件是否有原始文件)。

+0

我很抱歉这么晚回复,它完美的工作,并感谢伟大的解释。 – Chironex

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

听起来像find的工作!

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

其他解决方案类似,但会检查文件没有的“1”后缀真的存在,因此它不会不期而遇删除歌曲后缀名为“1”。

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

当'file.mp3'实际上是'file 1.mp3'的符号链接时,这里就有一个漏洞。此外,你可以做一个校验和,看看这些文件是否真的是一样的...哎呀,你可以做一个模糊检查的情况下,编码/标签是不同的。现在得到相当偏离 – sehe

0

更快:

find . -name "* 1.mp3" -exec rm {} + 
0
find . -type f -name '* 1.mp3' -print0 | xargs -0 rm 

哪个kbyrd提到是根据我的最佳方式,因为-print0和-0组合,因为。

-print0 True;在标准输出上打印完整文件名,然后用空字符(而不是 -print使用的换行符)跟在 之后。这允许包含换行符或其他类型的空格的文件名由处理查找输出的pro- 克正确解释。该选项对应于xargs的-0选项 。