find
来排序最近修改过的结果?这里是我正在使用的当前
find
(我正在用PHP进行shell换码,因此这就是变量):find '$dir' -name '$str'\* -print | head -10
如何按最新修改的顺序排序? (请注意,我不希望它在搜索之后进行排序,而是根据最近修改的内容查找结果。)
#1 楼
使用以下命令:find . -printf "%T@ %Tc %p\n" | sort -n
来自printf
的参数:man find
:文件的最后修改时间,以%Tk
指定的格式。 k
:格林尼治标准时间1970年1月1日以来的秒数,带小数部分。@
:语言环境的日期和时间(1989年11月4日星期六12:02:33 EST)。c
:文件名。评论
+1非常有用,我找到的第一个答案是可读/有用的日期输出
–杰克N
13年6月26日在13:48
最可靠(且非常简单),因为时间被授予数字顺序(因此总是可以正确排序),谢谢!
–水瓶座力量
14-10-26在1:31
我使用此别名来查找〜/ .zshrc中的最新文件:fr(){查找./ -iname“ *” $ @“ *” -printf“%T @%Td-%Tb-%TY%Tk:% TM%p \ n“ |排序-n |切-d“” -f 2- | grep -i“ $ @”; }它以递归方式查找包含传递给命令的第一个参数的模式的所有文件(fr
– joelostblom
16-10-27在23:01
这很棒 !!!要与符号链接一起使用,请使用find -L ...
–Varun Chandak
19年1月21日在9:49
您可能要使用ssed来消除秒的小数部分,而要使用@PeterMortensen显示的ISO8601:find。型f -printf“%TY-%Tm-%TdT%TT%p \ n” |排序-r | ssed -R's / ^([^。] +)\。\ d +(。*)$ / \ 1 \ 2 /'
–Ludovic Kuty
19年1月31日在8:51
#2 楼
最简单的方法是使用zsh,这要归功于其glob限定符。print -lr -- $dir/**/$str*(om[1,10])
如果您找到了GNU,请使其打印文件修改时间并以此排序。
find -type f -printf '%T@ %pfind -type f -printf '%T@ %p\n' |
sort -k 1nr |
sed 's/^[^ ]* //' | head -n 10
' |
sort -zk 1nr |
sed -z 's/^[^ ]* //' | tr 'find . -type f -print |
perl -l -ne '
$_{$_} = -M; # store file age (mtime - now)
END {
$,="\n";
@sorted = sort {$_{$a} <=> $_{$b}} keys %_; # sort by increasing age
print @sorted[0..9];
}'
' '\n' | head -n 10
如果您有GNU查找但没有其他GNU实用程序,则使用换行符作为分隔符,而不是null。您将失去对包含换行符的文件名的支持。
find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in (sorted(times.iterkeys(), key=lambda f:times[f], reverse=True))[:10]: print f'
如果您有Perl(在这里我假设文件名中没有换行符):
q4312078q
如果您使用Python(并且也假设文件名中没有换行符):
q4312078q
可能有一种方法在PHP中也是如此,但我不知道。
如果您只想使用POSIX工具,则要复杂得多;请参阅如何以递归方式列出按修改日期排序的文件(无可用stat命令!)(使前10个部分变得容易)。
评论
我认为查找版本显示了最旧的文件,因此您需要添加-r选项进行排序。
– Quentin Pradet
2012年9月7日在6:56
我的sed说它没有-z选项。
– Kef Schecter
15年7月15日在4:38
@KefSchecter然后使用换行符作为分隔符,但是您将失去对文件名中换行符的支持。
–吉尔斯'所以-不再是邪恶的'
15年7月15日在8:15
以上是针对python2的。如果您只有python3,请进行一些小的更改:python3 -c'import os,sys; times = {},用于sys.stdin.readlines()中的f:f = f [0:-1]; times [f] = os.stat(f).st_mtime for f in(sorted(times.keys(),key = lambda f:times [f],reverse = True))[:10]:print(f); '
–尼尔·麦吉尔(Neil McGill)
17年12月12日在15:33
#3 楼
您不需要PHP或Python,只需ls:man ls:
-t sort by modification time
-r, reverse order while sorting (--reverse )
-1 list one file per line
find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;
如果命令*以失败状态退出(即参数列表过长),则可以进行迭代找到。改写自:新进程的最大参数长度
find . -print0|xargs -0 command
(优化速度,如果find不实现“ -exec +”但知道“ -print0” )find . -print|xargs command
(如果参数中没有空格)如果参数的主要部分由长路径,绝对路径或相对路径组成,请尝试移动您的操作进入目录:
cd /directory/with/long/path; command *
另一个快速修复可能是匹配更少的参数:command [a-e]*; command [f-m]*; ...
评论
如果有很多文件,则失败,并在ls上显示“参数列表太长”。
– occulus
2012年9月3日上午8:41
没错,但我相信问题是“如何进行简单的查找...”
–ЯрославРахматуллин
2012年9月3日上午10:53
ls不会以xargs可以理解的方式引用文件名(没有-0选项,并且各种引用样式都不足够)
–东武
2014年11月8日23:13
#4 楼
扩展user195696的答案:find . -type f -printf "%T@\t%Tc %6k KiB %p\n" | sort -n | cut -f 2-
对于每个文件,它首先输出数字时间戳(用于排序,然后制表
\t
),然后输出人类可读的时间戳,然后文件大小(不幸的是find
的-printf
不能以兆字节为单位,只能以kb为单位),然后是具有相对路径的文件名。然后
sort -n
会按第一个数字字段对其进行排序。然后
cut
摆脱了用户不感兴趣的第一个数字字段。 (向前打印第二个字段。)默认的字段分隔符是\t
或制表符。输出示例:
Thu 06 Feb 2014 04:49:14 PM EST 64 KiB ./057_h2_f7_10/h2_f7_10.class
Fri 07 Feb 2014 02:08:30 AM EST 7962976 KiB ./056_h2_f7_400/h2__rh_4e-4.mph
Fri 07 Feb 2014 02:23:24 AM EST 7962976 KiB ./056_h2_f7_400/h2_f7_400_out_Model.mph
Fri 07 Feb 2014 02:23:24 AM EST 0 KiB ./056_h2_f7_400/h2_f7_400_out.mph.status
Fri 07 Feb 2014 02:23:24 AM EST 64 KiB ./056_h2_f7_400/1579678.out
Fri 07 Feb 2014 03:47:31 AM EST 8132224 KiB ./057_h2_f7_10/h2__rh_1e-5.mph
Fri 07 Feb 2014 04:00:49 AM EST 8132224 KiB ./057_h2_f7_10/h2_f7_10_out_Model.mph
Fri 07 Feb 2014 04:00:49 AM EST 0 KiB ./057_h2_f7_10/h2_f7_10_out.mph.status
Fri 07 Feb 2014 04:00:49 AM EST 64 KiB ./057_h2_f7_10/1579679.out
Fri 07 Feb 2014 09:47:18 AM EST 9280 KiB ./056_h2_f7_400/h2__rh_4e-4.mat
Fri 07 Feb 2014 10:51:23 AM EST 9728 KiB ./018_bidomain/h2_plain__rh_1e-5.mat
Fri 07 Feb 2014 10:58:33 AM EST 9568 KiB ./057_h2_f7_10/h2__rh_1e-5.mat
Fri 07 Feb 2014 05:05:38 PM EST 64 KiB ./058_h2_f7_stationary/h2_f7_stationary.java
Fri 07 Feb 2014 06:06:29 PM EST 32 KiB ./058_h2_f7_stationary/slurm.slurm
Sat 08 Feb 2014 03:42:07 AM EST 0 KiB ./058_h2_f7_stationary/1581061.err
Sat 08 Feb 2014 03:42:14 AM EST 64 KiB ./058_h2_f7_stationary/h2_f7_stationary.class
Sat 08 Feb 2014 03:58:28 AM EST 70016 KiB ./058_h2_f7_stationary/h2s__rh_1e-5.mph
Sat 08 Feb 2014 04:12:40 AM EST 70304 KiB ./058_h2_f7_stationary/h2s__rh_4e-4.mph
Sat 08 Feb 2014 04:12:53 AM EST 70304 KiB ./058_h2_f7_stationary/h2_f7_stationary_out_Model.mph
Sat 08 Feb 2014 04:12:53 AM EST 0 KiB ./058_h2_f7_stationary/h2_f7_stationary_out.mph.status
Sat 08 Feb 2014 04:12:53 AM EST 32 KiB ./058_h2_f7_stationary/1581061.out
Mon 10 Feb 2014 11:40:54 AM EST 224 KiB ./058_h2_f7_stationary/h2s__rh_4e-4.mat
Mon 10 Feb 2014 11:42:32 AM EST 224 KiB ./058_h2_f7_stationary/h2s__rh_1e-5.mat
Mon 10 Feb 2014 11:50:08 AM EST 32 KiB ./plot_grid.m
我故意使文件大小字段为6个字符,因为如果加长,很难从视觉上区分文件的大小。这样,大于1e6 KiB的文件就会突出显示出来:1个字符表示1-9 GB,2个字符表示10-99 GB,依此类推。
编辑:这是另一个版本(自
find . -printf "%Tc"
在MinGW / MSYS上崩溃):find . -type f -printf "%T@\t%p\n" | sort -n | cut -f 2- | xargs -I{} ls -Glath --si {}
输出类似:
-rw-r--r-- 1 es 23K Jul 10 2010 ./laptop_0000071.jpg
-rw-r--r-- 1 es 43M Jul 29 19:19 ./work.xcf
-rw-r--r-- 1 es 87K Jul 29 20:11 ./patent_lamps/US Patent 274427 Maxim Lamp Holder.jpg
-rw-r--r-- 1 es 151K Jul 29 20:12 ./patent_lamps/Edison screw-in socket.png
-rw-r--r-- 1 es 50K Jul 29 20:13 ./patent_lamps/1157 Lamp.jpg
-rw-r--r-- 1 es 38K Jul 29 20:14 ./patent_lamps/US06919684-20050719-D00001.png
其中:
-I{}
导致用参数替换{}
的出现,并且换行符现在是参数分隔符(请注意上面文件名中的空格)。ls -G
禁止打印组名( ls -h --si
产生人类可读的文件大小(使用--si
更正确)。ls -t
按时间排序,在这里无关紧要,但这是我通常使用的。评论
注意:要按文件大小排序,只需在以上任一命令中用s替换T @。
– Evgeni Sergeev
2014年12月23日下午4:43
#5 楼
您只需要ls就可以如上所述执行
find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;
,或
ls -1rt `find /wherever/your/file/hides -type f`
评论
如果有很多文件,则失败,并在ls上显示“参数列表太长”。也许打算使用xargs?
– occulus
2012年9月3日上午8:41
但是,如果xargs多次调用ls,则排序将被破坏。
– Aaron D. Marasco
2015年11月2日在17:48
对于名称中带有空格的文件,此操作将失败。有什么建议吗?
–user74094
18年1月19日在14:16
只是偶然发现了这个答案,而这正是我在类似情况下所需要的。问题:+是什么?到底做什么?没有似乎可以得到相同的结果;但是,如果没有+,它将无法正常工作?
–RocketNuts
19 Mar 21 '19在23:36
这与8个月前发布的另一个答案相同,除了有关使用“ ls -1rt`find…`”的部分,该部分已被打破。
–Clément
19年4月13日在19:16
#6 楼
我有一个适用于FreeBSD(OS X)和Linux的简单解决方案:find . -type f -exec ls -t {} +
评论
这非常有效-应该是正确答案,或者至少是更高的评分!
– digitaltoast
19年6月14日在8:13
找 。 -type f -exec ls -lat {} +为您提供更好的日期和时间,以显示是否有人需要此格式
– jturi
20-2-11在14:21
#7 楼
@ user195696的答案的OS X变体:带时间戳:
find . -type f -exec stat -f "%Sm %N" -t "%Y%y%m%d%H%M" {} \; | sort -r
不带时间戳:
find . -type f -exec stat -f "%Sm %N" -t "%Y%y%m%d%H%M" {} \; | sort -r | awk -F' ' '{ print substr(q4312078q, length() + 2) }'
#8 楼
我发现这可以在Mac OS X上完成工作(并且通用性也足以在其他Unixen上工作):find . -type f -ls | awk '{print $(NF-3), $(NF-2), $(NF-1), $NF}' | sort
评论
可悲的是,这会在我的克罗地亚语设置中打印出本地化的月份名称,从而使排序不正确。
–伊凡(IvanVučica)
13年4月15日在20:19
user195696的答案适用于克罗地亚语设置(和其他设置)。
– Peter Mortensen
16 Dec 27 '14:13
#9 楼
按日期排序的sort | head
干净而健壮:使用
ls -l
进行漂亮的打印find . ! -type d -printf "%T@ %pfindByDate() {
local humansize=''
[ "" = "-h" ] && humansize='h' && shift
find . ${2:-! -type d} -printf "%T@ %pUsage: findByDate [-h] [lines] [find options]
" |
sort -zrn |
head -zn ${1:--0} |
sed -z 's/^[0-9.]\+ //' |
xargs -0 ls -dlt${humansize}
}
" |
sort -zrn |
head -zn 10 |
sed -z 's/^[0-9.]\+ //' |
xargs -0 ls -lt
作为bash函数:
findByDate
可以使用一个或两个参数运行,甚至不使用以下参数:
findByDate -h 12
样品:
findByDate 42 '-type l'
将列出按日期排序的所有非目录。注意:即使在大文件系统树上,由于
xargs
已接收到已排序列表,因此即使必须多次运行ls
,文件顺序也保持正确。findByDate -0 '( -type l -o -type b -o -type s -o -type c )'
将列出按日期排序的12个最近的非目录,并且以人类可读的格式打印大小
findByDate() {
local humansize=''
[ "" = "-h" ] && humansize='h' && shift
find . ${2:-! -type d} -printf "%T@ %pUsage: findByDate [-h] [lines] [find options]
" |
sort -zn |
tail -zn ${1:-+0} |
sed -z 's/^[0-9.]\+ //' |
xargs -0 ls -dltr${humansize}
}
将列出42个最近的非目录符号链接
q4312078q
将列出所有符号链接,块设备,套接字和字符设备,按日期排序。
倒序
替换
head
通过tail
并更改sort
和ls
的开关:q4312078q
功能相同,用法相同:
q4312078q
#10 楼
如果您选择find
非常简单,则可以不用它,而只需使用ls
即可:ls -1 *.cc # -r -t optional
#11 楼
请尝试:find '$dir' -name '$str'\* -print | xargs ls -tl | head -10
,但是通过
-mmin
/ -mtime
和-type
过滤数据也很有用。#12 楼
使用:find . -type f -mtime 0 -printf "[%TD %TI:%TM%Tp] %s %p\n" | sort -n | awk '{
hum[1024**4]="TB"; hum[1024**3]="GB"; hum[1024**2]="MB"; hum[1024]="KB"; hum[0]="B";
for (x=1024**4; x>=1024; x/=1024){
if (>=x) { printf " ""\t%7.2f %s\t%s\n",/x,hum[x],;break }
}}';
此命令将按修改的日期对文件进行排序。
并显示为:
[12/05/13 03:10PM] 1.75 MB ./file.text
[12/06/13 11:52PM] 2.90 MB ./file2.mp4
[12/07/13 04:11PM] 4.88 MB ./file3.mp4
[12/07/13 09:17PM] 4.74 MB ./test.apk
评论
我改进了此脚本以处理文件名中的空格,请参见superuser.com/a/777007/134532
– jan
2014年7月4日14:59
#13 楼
我认为find
没有任何选项可以修改输出顺序。使用-mtime
和-mmin
,您可以将结果限制为在特定时间范围内已修改的文件,但不会对输出进行排序-您必须自己做。 GNU find
有一个-printf
选项,除其他外,它可以让您打印找到的每个文件的修改时间(格式字符串%t
或%Tk
);这可能会帮助您按照自己的方式对find
输出进行排序。#14 楼
我通过使脚本正确处理文件名中的空格来改进了Akashs答案:find . -type f -mtime 0 -printf ";[%TD %TI:%TM%Tp];%s;%p\n" | sort -n | awk -F ";" '{
hum[1024**4]="TB"; hum[1024**3]="GB"; hum[1024**2]="MB"; hum[1024]="KB"; hum[0]="B";
for (x=1024**4; x>=1024; x/=1024){
if (>=x) { printf " ""\t%7.2f %s\t%s\n",/x,hum[x],;break }
}}';
#15 楼
如果您想按时间在$PWD
中订购所有PNG文件:这种简单的一排式便可以在
find
和ls
上提供正则表达式的所有灵活性。find $PWD -name "*.png" -print0 | xargs -0 ls -laht | less
#16 楼
您可以通过以下方式在BSD和Linux上使用stat
(不适用于POSIX):$ stat -f "%m%t%N" /[the dir]/* | sort -rn | cut -f2-
如果要限制数量:
$ stat -f "%m%t%N" /[the dir]/* | sort -rn | head -[the number] | cut -f2-
#17 楼
如果只想获取每个项目的完整路径,则可以这样写下。 find FIND_ROOT -maxdepth 1 -type f -printf "%T@ %p\n" | sort -nr | head -10 | cut -d ' ' -f 2
其中-printf“%T @%p \ n”用于排序标准(日期),'sort -nr'用于按日期排序,head -10用于列出前10个结果,cut -d''-f 2用于减少每行的开头时间戳。
评论
如果文件名包含空格,则cut -d''-f 2将中断。
– F. Hauri
19年9月11日在8:34
#18 楼
我有一个简单的解决方案。将
cd
移至目录后,请使用find . -iname "*" -ls
评论
这不会按修改日期排序。
–DavidPostill♦
17 Mar 25 '17在9:40
评论
github.com/shadkam/recentmost将完成所需的工作-但需要构建它