![Bash:按文件日期对数组元素进行排序](https://linux22.com/image/103034/Bash%EF%BC%9A%E6%8C%89%E6%96%87%E4%BB%B6%E6%97%A5%E6%9C%9F%E5%AF%B9%E6%95%B0%E7%BB%84%E5%85%83%E7%B4%A0%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F.png)
我有一个 Bash 脚本,其中有一个名为 myarray 的数组。
该数组包含 4 个文件的完整文件位置路径。
我想做的是按文件创建日期对数组元素进行排序。
举个简单的例子,如果数组中有以下 4 个文件:
/tmp/file1.txt (in index 0)
/tmp/test/file1.txt (in index 1)
/tmp/test1/file1.txt (in index 2)
/tmp/test2/file1.txt (in index 3)
...索引 2 中的文件的创建日期比其他文件更新,因此应将其排序到索引 1 中,依此类推。
我最初认为以下内容可以做到这一点:
myarray=($(for each in ${myarray[@]}; do echo $each; done | sort -n))
但如果我查看数组内容,我在索引 0 中看不到最新文件。
有人知道在 bash 中实现这一点的方法吗?
答案1
以下按修改日期对文件进行排序,因为我测试脚本的系统不支持创建日期。如果支持,替换%Y
为%W
应该输出创建时间。
#! /bin/bash
files=(*.txt)
while IFS= read -r line ; do
sorted+=("$line")
done < <(
for f in "${files[@]}" ; do
echo $(stat -c %Y -- "$f")$'\t'"$f"
done | sort -nk1,1 | cut -t $'\t' -f2-
)
echo "${sorted[@]}"
它适用于名称中带有空格的文件。包含换行符的文件名可能会破坏它,但您不会在文件名中使用换行符,对吧?