按修改时间对具有特定扩展名的文件进行排序并将其存储到数组中

按修改时间对具有特定扩展名的文件进行排序并将其存储到数组中

我找到了许多对目录文件进行排序甚至将它们保存在数组中的答案。

排序示例

ls -t 

数组中的目录列表

array=(*)

我的特殊问题需要使用特定的方式对文件进行排序扩大(比如说*.sh)基于它们的修改日期/时间,并将所有这些排序的文件保存在数组中,以便稍后用于编辑或删除文件。

例如,在数组中排序文件后,我可以通过以下命令执行删除最新的文件。

rm ${array[0]} 

答案1

桀骜这很简单

array=(*.sh(Nom))

全局限定符 om导致匹配项按修改时间排序(最新的在前),N如果没有匹配项,则强制数组为空(而不是导致错误)。

在其他 shell(例如 bash)中,没有按时间排序的好方法。您可以使用ls -t,但这可能会中断,因为输出不明确。如果您知道文件名仅包含ls被认为可打印的字符,并且不是空格或\[*?,则可以使用命令替换:

array=($(ls -t -- *.sh 2>/dev/null))

您可以通过保护通配符和水平空白来使其更加健壮,但换行符和不可打印字符仍然是一个问题。

IFS=$'\n'; set -f
array=($(ls -t -- *.sh 2>/dev/null))
unset IFS; set +f

除 zsh 外,在引用变量值时不要忘记双引号,并--保护名称以破折号开头的文件,否则会被解释为选项,例如rm -- "${array[0]}"

答案2

要稳健地做到这一点,ls您应该不是除路径分隔符之外的任何内容上进行分割 - 这就是它的用途。

IFS=/; set -f
set -- $(ls -dt ./*)
shift

这将对当前目录中的所有非点文件进行排序,并将结果放入 shell array 中$@。给定 POSIX ls,这不会受到任何类型的文件名修改的影响:各种特殊字符(包括换行符)都会保留在分隔结果中。每一个(但最后一个)不过,.名称后会附加一个额外的点。如果您想将结果放入更永久的数组中,您可以一起处理这些作业,例如:

a=()
until [ -z "$2" ] &&
      a+="$1" && shift
do    a+="${1%?}"
shift;done

无论其他人可能将您链接到什么样的无意义博客,您ls如果您知道要寻找什么,则可以稳健地处理的结果。

相关内容