我需要将已排序、带引号的 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"
正在执行的操作。