我想解决“列出当前目录中超过 20MB 的前 10 个最新文件”的问题。
我可以这样ls
做:
ls -Shal |head
获取前 10 个最大的文件,并且:
ls -halt |head
获取前 10 个最新文件
通过 find 我可以这样做:
find . -size +20M
列出当前目录(以及我不想要的子目录)中所有超过 20MB 的文件。
有没有办法列出超过一定大小的前十个最新文件,最好使用ls
?
答案1
“当前目录”选项find
是-maxdepth 1
.满足您需求的整个命令行是:
find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head
或者
find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head
答案2
注意:这适用于 GNU 查找,但不适用于所有其他查找。
find . -maxdepth 1 -size +20M -printf "%T@ %f\n" |
sort -nr | head -n 20 | sed 's/[^ ]\+ //'
像@Rajish 一样开始,但使用printf
命令 fromfind
来指定输出格式。有3种与时间相关的格式,atime、ctime和时间-%T
用于 mtime,%A
用于%C
其他格式。
@
是指定自纪元以来以秒为单位的时间格式。%f
用于文件名,\n
用于两个文件之间的换行符。
然后按相反顺序按数字排序,首先给出最年轻的文件,我们采用 20 行head
。
最后,sed
被用来丢弃时间信息。
1) 由于head
逐行工作,因此名称中包含超过 20 个换行符的单个文件(这有点不寻常,但并不禁止)如果属于前 20 个匹配项,则可能会损坏输出。如果您碰巧有此类文件,请尝试删除它们 - 好吧,更改它们的名称。对于简单的脚本来说,它们通常会成为问题。
答案3
兹什的全局限定符让这变得容易。限定符.
仅选择常规文件,Lm+20
选择至少 20MB 加 1 个字节长的文件;要包含正好 20MB 长的文件,请使用L+20971519
.然后om
按修改时间递减排序,并将[1,10]
扩展限制为前 10 个匹配项。如果您想按日期列出文件,您仍然需要-t
选择;ls
或者您可以将文件传递给其他命令(首先是最年轻的)。要将文件首先传递给另一个命令(其中最旧的文件),请使用Om
按增加修改时间进行排序并[-10,-1]
提取最后 10 个匹配项。
ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])
答案4
这将仅打印指定的 10 个文件,无论文件名中是否嵌入了换行符。它使用文件系统inodes
cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \
| sort -nr | head | cut -f 2)
do
ls -l "$(find . -inum $i)"
done