按修改时间对文件排序


8

我在这里看到了许多问题和答案,它们使用的构造类似于

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

要么

ls -t | while read i; do

现在,我知道您不应该在脚本中使用ls,因为它很容易损坏;但我找不到从上次修改到最近修改(反之亦然)的顺序处理文件的更好方法。

我可以使用类似:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

...但是这仍然会与名称中包含换行符的任何文件一起中断,并且引导起来要难看得多。有没有更好的办法?

Answers:


8

“请勿在脚本中使用ls”是POSIX ls“仅”的问题;有关GNU的信息,请参见--quoting-style=

GNU sort解决了的问题--zero-terminated

如果必须兼容,则可以find ... -exec一次将一个文件名传递给执行转义的脚本。如果至少有bash可用:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb

啊,--zero-terminated-谢谢你,我希望我能给你更多点!
evilsoup

...好吧,我有点困惑info ls:如果我想要带ls的防弹脚本,--quoting-style应该使用哪个脚本?
evilsoup

@evilsoup我认为--quoting-style=escape是选择的方式。
Hauke Laging

现在,创建一些名称中带有换行符的文件以对其进行测试:P
evilsoup,

1
另外:我偶然发现一种极端情况,即GNU ls --quoting-style失败(出于解析目的),因为它仅引用文件名:当组名中有空格时。好的,这是一个非常临时的案例,但是它出现在cygwin bash shell中,这里的组名如Domain Users
DavAlPi

4

到目前为止,最简单的方法是使用zsh。的限定符的glob om排序以相反的时间顺序匹配; 使用Om的时间顺序。

for x in /path/to/dir/*(Nom); do …

N水珠限定词使扩大到一个空列表,如果该目录是空的格局。使它*(DNom)与点文件匹配。


1
ang,这是我第一次尝试去研究其他外壳-很好。
evilsoup
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.