如何删除至少有一个版本为 .flac 的重复音乐文件

如何删除至少有一个版本为 .flac 的重复音乐文件

我不得不合并几个音乐目录,结果得到了许多重复文件。如果其中一个是 .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.flacmusic4.flac重复项将被删除,因为music2.mp3music2b.mp3和没有重复项需要删除,并且虽然music3.flac有重复项,但它们都没有扩展名。我还假设您的目录中没有诸如这样的文件。如果存在此类文件,它们将被视为重复项(如果有)。 music5b.flacmusic6.flacmusic1.backup.flacmusic1.flac

根据假设,您可以这样做:

$ shopt -s extglob
$ for i in `ls | egrep .flac$ | sed 's/\.flac$//'`; do rm "$i".!(flac);done 2>/dev/null
$ shopt -u extglob

现在让我们看看上面的命令做什么:

  1. .flac第二个列出了所有以扩展名结尾的文件( ls | egrep .flac$),
  2. .flac然后从名称末尾删除( | sed 's/\.flac$//),
  3. 然后,对于前两个步骤得到的每个名称,删除所有具有该名称和扩展名的文件,
  4. 除了带有.flac扩展名的文件。rm "$i".!(flac)删除所有以 开头的文件"$i",并排除带有扩展名的文件 .flac。如果您不运行shopt -s extglob(即,如果您不启用extglob),像 这样的模式 "$i"!(.flac)将没有任何特殊含义,并且 bash 会精确搜索文件名"$i"!(.flac)。(名称"$i"后跟 然后!是 a(等等。)
  5. 最后,您可以禁用extglob使用shopt -u extglob

extglob您可以在中看到以下内容man bash

如果 外接球 shell 选项是使用商店内置,可以识别多个扩展模式匹配运算符。在下面的描述中,模式列表是由 | 分隔的一个或多个模式的列表。复合模式可以使用以下一个或多个子模式形成:

  • ?(模式列表)
    匹配零次或一次给定的模式
  • *(模式列表)
    匹配零次或多次给定的模式
  • +(模式列表)
    匹配给定模式的一个或多个出现
  • @(pattern-list)
    匹配给定的模式之一
  • !(模式列表)
    匹配除给定模式之外的任意内容

另外,看一下这个问题:
在 unix/linux shell 中进行模式匹配时如何使用逆通配符或负通配符?

相关内容