查找早于X天的文件并按文件大小输出


8

我正在尝试使文件早于几天,并根据其大小及其所有信息(大小,完整路径等-由提供的类似信息)以降序排列ls

虽然我可以通过以下方式查找较旧的文件:

find . -mtime +10

我无法列出所需的信息。


请添加您的发行版和外壳程序信息
lese 2015年

@lese:AIX 6.1;而echo $
SHELL-

这听起来像是XYProblem ... ...您是否真的需要按大小顺序排列所有文件?还是您(更有可能)正在寻找足够大的“旧”(> 10天)文件而只需要说200个最大文件,然后决定可以删除其中一个文件以节省空间?在后一种情况下,由于您使用的AIX可能没有gnu工具,因此find(输出大于10天的所有文件)和awk(将阵列中前200个最大的文件保留,然后按顺序输出)组合在一起最佳选择
Olivier Dulac

Answers:


8

前提是您的文件路径包含换行符:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

参见find手册,章节Actions

  • %s 文件大小(以字节为单位)。
  • %n文件 的硬链接数。
  • %m 文件的权限位(八进制)。
  • %u 文件的用户名,如果没有用户名,则为数字用户ID
  • %g 文件的组名,或者数字组ID(如果该组没有名称)。
  • %t 文件的最后修改时间,格式为C ctime函数返回的格式。
  • %p 文件名。
  • %l符号链接的 对象(如果文件不是符号链接,则为空字符串)。

顺便说一句:请注意,POSIX find手册并未指定上述大多数操作。


1
它说:查找:0652-017 -printf不是有效的选项。
user148335

对我来说,这有效,并且似乎是一个非常干净的解决方案+1
lese 2015年

@ user148335,您没有提到您正在运行的Linux发行版。似乎您仅限于POSIX find规范,这非常有限。
patryk.beza 2015年

1
@ patryk.beza我猜你用user148335说话
冒犯

AIX 6.1; 而echo $
SHELL-

4

此命令仅使用find和的POSIX功能ls

find . -type f -mtime +10 -exec ls -lS {} +

但是,如果当前目录(或递归子目录)中有大量与主文件匹配的文件,它可能会调用ls不止一次。-mtime +10

ls当然,如果调用不止一次,则排序将仅在每个ls执行中完成,而不是在多个执行中进行。

不过,对于合理数量的文件,这可能是您最好的选择。


更新的版本名称中没有空格
Miguel G

1
如果ls只传递一个参数,则几乎无法对其进行排序。使用+代替;,那会更好,但是ls如果有很多文件,仍然可能多次被调用。
斯特凡Chazelas

2
这是我会给出的确切命令,因此我添加了与之相关的解释性文字。
通配符

3

zsh

ls -ldrS -- **/*(m+10)

或避免双重排序(按名称按zsh和按大小按ls):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

或(如果您ls支持-U未分类):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

D如果您还想查看隐藏文件,则添加glob限定符。


用户名和组名包含空格时,此功能有效吗?
roaima

@roaima,是的。为什么不呢?对于E2BIG,它可能会中断,您可以使用来解决zargs
斯特凡Chazelas

既然您提供了它,我怀疑它会很好,但是我需要问一下:-)
roaima

1

我认为您可以执行以下操作:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'\0' line; do
    #echo "$line"
    ls -lS "$line"    
done

注意command 的-S参数ls

-S按文件大小排序


在由于消息而删除-d $'\ 0'之后:$ \ 0:这不是我设法获取输出的标识符,但是文件未根据其大小降序写入
user148335

当您在下遇到目录时将中断/home/phphil。试试ls -ld ...
roaima 2015年

@Roaima,使用find . -type f代替呢?
lese 2015年

@lese我已经更改了代码,但是命令似乎从每个子文件夹向每个文件抛出两次。例如
user148335

find ... -type f会起作用,以及将-d标志添加到ls
roaima

1

尝试这个:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g

使用-n选项,这并不麻烦,因为ls不列出用户名和组名,而是列出uid和gid
dervishe 2015年

0

为了使单线更简单,您可以使用findoption -ls。在大多数情况下,文件大小显示在列出的信息的第七列(因此7,请在命令末尾进行相应更改,否则请进行更改):

find . -type f -mtime +10 -ls | sort -n -r -k7

0

另一种变化是使用:

  • 查找(查找匹配的文件)
  • du(以KB为单位显示文件大小)
  • -n -r排序(以降序简称)

这是命令:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
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.