我找到了许多对目录文件进行排序甚至将它们保存在数组中的答案。
排序示例
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
如果您知道要寻找什么,则可以稳健地处理的结果。