读取find
搜索结果并将它们存储到一个数组中的同时,我希望它们能够按照特定方式排序(比如说 mp3 文件,通过文件名中的音轨编号),以下代码应该可以实现:
mp3s=()
while read -r -d $'\0'; do
mp3s+=("$REPLY")
done < <(sort <(find "$mp3Dir" -type f -name '*.mp3' -print0))
但是数组中的元素从未按照文件名的第一部分(即mp3曲目编号:01_...,02_...,03_...等)正确排序。
虽然以下方法可以完成任务,但似乎有些不必要的麻烦:
mp3s=()
while read -r -d $'\0'; do
mp3s+=("$REPLY")
done < <(find "$mp3Dir" -type f -name '*.mp3' -print0)
mp3s=( $(for f in "${mp3s[@]}" ; do
echo "$f"
done | sort) )
有没有更简单的方法来完成这个任务,与我在第一个例子中想到的类似?我已经尝试通过阅读sort
命令的各种选项(-n,-d等)来排序find
命令的结果,但是目前还没有成功。
那么,在数组最初被填充时,是否有更有效的方法来整合sort
命令呢?
$'\0'
和''
完全相同,因为bash使用NUL分隔的字符串,因此无法在字符串中存储NUL。这正是在-d
中起作用的原因--零长度的NUL分隔字符串的第一个字符当然是其NUL分隔符。就个人而言,我认为$'\0'
语法是不好的实践,因为它可能会让人们相信bash可以在字符串内部存储NUL,这是错误的,而不是只使用IFS= read -r -d ''
。 - Charles Duffy$'\0foo'
放入一个字符串中,然后尝试提取foo
。 - Charles Duffy