我有目录中的文件列表,其中文件名为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"
。当你用琐碎的文件名测试它时,它看起来像是在不引用的情况下工作,但当你在真实的文件上运行它时,会以惊人且难以调试的方式中断。