find + -printf + 排序冲突?

find + -printf + 排序冲突?

我需要将已排序、带引号的 FLAC 文件名列表传递给 SoX 进行串联,但在按我期望的方式进行排序时遇到问题。

如果我使用:

find . -maxdepth 1 -type f -iname "*.flac" | sort

我得到的正是我所期望的:

./01-Lordy.flac
./02-Both Sides Now.flac
./03-Solitary Man.flac
./04-Holly Holy.flac
./05-Cherry Cherry.flac
./06-Kentucky Woman.flac
./07-Sweet Caroline.flac
./08-Thank the Lord for the Nightime.flac
./09-And the Singer Sings His Song.flac
./10-Brother Loves Traveling Salvation Show.flac

但是,我不能真正将其用于我正在做的事情,因为我需要一个没有换行符的引用列表。我知道 -printf 可以为我做到这一点,但是当我尝试时:

find . -maxdepth 1 -type f -iname "*.FlAc" -printf "\"%p\" " | sort

我最终得到了一个文件名列表,这些文件名被引用并用一个空格分隔(好!),但它们没有排序(坏!)。或者至少它们没有按照我期望的方式排序:

"./08-Thank the Lord for the Nightime.flac" "./03-Solitary Man.flac" "./09-And the Singer Sings His Song.flac" "./05-Cherry Cherry.flac" "./06-Kentucky Woman.flac" "./10-Brother Loves Traveling Salvation Show.flac" "./07-Sweet Caroline.flac" "./02-Both Sides Now.flac" "./01-Lordy.flac" "./04-Holly Holy.flac"

也许更奇怪的是,如果我只是为了测试而使用相同的代码但添加换行符:

find . -maxdepth 1 -type f -iname "*.FlAc" -printf "\"%p\" "\\n | sort

即使输出不再是我需要的,排序仍然有效:

"./01-Lordy.flac" 
"./02-Both Sides Now.flac" 
"./03-Solitary Man.flac" 
"./04-Holly Holy.flac" 
"./05-Cherry Cherry.flac" 
"./06-Kentucky Woman.flac" 
"./07-Sweet Caroline.flac" 
"./08-Thank the Lord for the Nightime.flac" 
"./09-And the Singer Sings His Song.flac" 
"./10-Brother Loves Traveling Salvation Show.flac"

这是在Ubuntu 18.04.1下

答案1

如果文件都在同一目录中,并且您想要将排序后的文件名列表传递给sox,那么 bash shell 可以直接执行此操作:

shopt -s nocaseglob
sox *.flac

shellnocaseglob选项允许通配符选取 foo.FLAC、foo.Flac、foo.flaC 等。通配符扩展为按字母顺序排序的列表,就像裸露的一样sort。例如,它会放在9-file.flac以 . 开头的任何文件名之后8

感谢 @mosvy 将上述 bash-ism 简化为适用于任何 shell 的通配符:

sox *.[Ff][Ll][Aa][Cc]

括号允许“flac”扩展名中大小写字母的任意组合,以匹配您find ... -iname "*.FlAc"正在执行的操作。

相关内容