Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 查找和删除前缀相同但扩展名不同的文件(即*.flac和*.mp3)_Bash_Find_Mp3_Flac - Fatal编程技术网

Bash 查找和删除前缀相同但扩展名不同的文件(即*.flac和*.mp3)

Bash 查找和删除前缀相同但扩展名不同的文件(即*.flac和*.mp3),bash,find,mp3,flac,Bash,Find,Mp3,Flac,在我的音乐目录中,我有多个.mp3和.flac格式的重复文件。考虑: /dir1/music1.flac /dir1/music1.mp3 /dir2/music1.mp3 /dir2/music2.MP3 /dir2/music2.flac /dir2/music3.mp3 dir1中的music1.flac和music1.mp3是不同格式的同一首歌曲,但dir1和dir2中的music1.mp3可能不是(名称相同,但发行在不同的专辑中) 我希望遍历多个子目录,找到前缀相同但扩展名不同的文件

在我的音乐目录中,我有多个.mp3和.flac格式的重复文件。考虑:

/dir1/music1.flac
/dir1/music1.mp3
/dir2/music1.mp3
/dir2/music2.MP3
/dir2/music2.flac
/dir2/music3.mp3
dir1中的music1.flac和music1.mp3是不同格式的同一首歌曲,但dir1和dir2中的music1.mp3可能不是(名称相同,但发行在不同的专辑中)

我希望遍历多个子目录,找到前缀相同但扩展名不同的文件,然后只删除mp3文件。因此,对于上述目录,我只剩下:

/dir1/music1.flac
/dir2/music1.mp3
/dir2/music2.flac
/dir2/music3.mp3
我尝试将find命令与逻辑AND一起使用,但没有效果。我的一些失误:

find ./ -regex '.*\(mp3\|flac\)$'
find . -type f -name "*mp3" -and -name "*flac"

感谢您的帮助。我已经用我自己发布的stackoverflow代码解决了类似的问题,但我在这个问题上被难住了。你们太棒了。

这将确认将删除的文件:

find . -type f|sort|awk -F ":" '{match($1,"(.+)\\.[A-Za-z0-9]+$",base); if (base[1]==prev) {fordel=$1} else {fordel=null};if (base[1]) prev=base[1]; if(fordel) {print "\"" fordel "\""}}'|xargs echo
这将处理删除:

find . -type f|sort|awk -F ":" '{match($1,"(.+)\\.[A-Za-z0-9]+$",base); if (base[1]==prev) {fordel=$1} else {fordel=null};if (base[1]) prev=base[1]; if(fordel) {print "\"" fordel "\""}}'|xargs rm
这两种解决方案都将处理文件中的空格。

请尝试以下(-clean)代码:

它需要Bash 4.0或更高版本,因为它使用
globstar

由于您的示例同时包含小写和大写“.mp3”,因此该代码处理“.mp3”或“.flac”的任何大小写。如果没有必要,可以简化


删除
rm
行上的注释,使其实际删除文件。

这种事情很容易出错,删除的内容超出了预期。你有好的备份吗?我有多个备份。我理解风险。谢谢你的贡献。此代码适用于没有任何空格的文件,但无法删除对文件,例如“圣诞歌曲.mp3”和“圣诞歌曲.flac”@doogie,谢谢您的反馈。看见
#! /bin/bash

shopt -s nullglob   # Globs that match nothing expand to nothing
shopt -s globstar   # ** matches multiple directory levels

for mp3_path in **/*.[Mm][Pp]3 ; do
    # Find '.flac', '.FLAC', '.Flac', ..., files with the same base
    flac_paths=( "${mp3_path%.*}".[Ff][Ll][Aa][Cc] )
    if (( ${#flac_paths[*]} > 0 )) ; then
        # There is a(t least one) FLAC file so remove the MP3 file
        printf "Removing '%s'\\n" "$mp3_path"
        # rm -- "$mp3_path"
    fi
done