bash根据时间字符串名称对数组进行排序



我有目录中的文件列表,其中文件名为hh-mm-ss时间格式。

05-31-04.mp4 
05-32-04.mp4 
05-34-04.mp4 
05-33-04.mp4
05-30-00.mp4

我需要根据文件名对文件进行排序

05-30-00.mp4
05-31-04.mp4 
05-32-04.mp4 
05-33-04.mp4
05-34-04.mp4 

现在我有以下代码列出文件

x=$(find . -name "*.mp4" -printf "%fn")
for file in $x; do
echo "File -> $file"

这根本不是一个数组。x是一个简单的字符串变量,在不引用它的情况下对它进行循环会将它拆分为空白。

如果文件名中有空格或其他外壳元字符,这是有问题的,但如果简单的文件名具有代表性,则是不带字符的。在这种情况下,只是。。。CCD_ 2。

x=$(find . -name "*.mp4" -printf "%fn" | sort)
printf "File -> %sn" $x

不过,不引用字符串变量会带来大量警告。可能确实使用了数组。

readarray -d '' x < <(find . -name "*.mp4" -print0 | sort -z)
printf "File -> %sn" "${x[@]}"

(readarray需要Bash 4+,因此在MacOS上无法开箱即用。find -print0及其配套的sort -z是一个GNU扩展,不能移植到POSIX/非GNU系统。(

如果所有文件都在当前目录中,则find完全是过度杀伤;只需使用shell内置的通配符扩展,默认情况下进行排序。

printf "File -> %sn" *.mp4

如果您需要对文件进行循环并执行比打印每个文件更有用的操作,则不需要变量。只需直接在通配符展开上循环即可。

for file in *.mp4; do
# This is where we do something more useful than ...
printf "File -> %sn" "$file"
done

请注意,您也需要在循环中引用"$file"。当你用琐碎的文件名测试它时,它看起来像是在不引用的情况下工作,但当你在真实的文件上运行它时,会以惊人且难以调试的方式中断。

相关内容

  • 没有找到相关文章

最新更新