我不得不合并几个音乐目录,结果得到了许多重复文件。如果其中一个是 .flac 文件,我想删除重复文件并保留 .flac 文件。我只想比较同一文件夹中的文件,因为这些文件代表专辑,这对我整理音乐来说是一种有用的方法。
我正在运行 Ubuntu 15.10,带有一个 bash shell。
非常感谢您对命令行工具的帮助。非常感谢,
答案1
在回答你的问题之前,我有一些假设:假设你有一个这样的目录
$ ls -1 myMusics
music1
music1.flac
music1.mp3
music2.mp3
music2b.mp3
music3.flac
music4.flac
music4.wav
music5b.flac
music6
music6.mp3
music6.wav
在上面的目录中,只有music1.flac
和music4.flac
重复项将被删除,因为music2.mp3
、music2b.mp3
和没有重复项需要删除,并且虽然music3.flac
有重复项,但它们都没有扩展名。我还假设您的目录中没有诸如这样的文件。如果存在此类文件,它们将被视为重复项(如果有)。 music5b.flac
music6
.flac
music1.backup.flac
music1.flac
根据假设,您可以这样做:
$ shopt -s extglob
$ for i in `ls | egrep .flac$ | sed 's/\.flac$//'`; do rm "$i".!(flac);done 2>/dev/null
$ shopt -u extglob
现在让我们看看上面的命令做什么:
.flac
第二个列出了所有以扩展名结尾的文件(ls | egrep .flac$
),.flac
然后从名称末尾删除(| sed 's/\.flac$//
),- 然后,对于前两个步骤得到的每个名称,删除所有具有该名称和扩展名的文件,
- 除了带有
.flac
扩展名的文件。rm "$i".!(flac)
删除所有以 开头的文件"$i"
,并排除带有扩展名的文件.flac
。如果您不运行shopt -s extglob
(即,如果您不启用extglob
),像 这样的模式"$i"!(.flac)
将没有任何特殊含义,并且 bash 会精确搜索文件名"$i"!(.flac)
。(名称"$i"
后跟 然后!
是 a(
等等。) - 最后,您可以禁用
extglob
使用shopt -u extglob
。
extglob
您可以在中看到以下内容man bash
:
如果 外接球 shell 选项是使用商店内置,可以识别多个扩展模式匹配运算符。在下面的描述中,模式列表是由 | 分隔的一个或多个模式的列表。复合模式可以使用以下一个或多个子模式形成:
- ?(模式列表)
匹配零次或一次给定的模式- *(模式列表)
匹配零次或多次给定的模式- +(模式列表)
匹配给定模式的一个或多个出现- @(pattern-list)
匹配给定的模式之一- !(模式列表)
匹配除给定模式之外的任意内容
另外,看一下这个问题:
在 unix/linux shell 中进行模式匹配时如何使用逆通配符或负通配符?