使用 find 按大小对所有文件进行排序

使用 find 按大小对所有文件进行排序

作为实践,我需要完成一个脚本,该脚本按大小对具有给定扩展名(例如 .txt)的所有填充进行排序,包括子目录中的填充。

For example; 
./ex1.sh einstein txt
einstein/copyright.txt
einstein/do-how.txt
einstein/etext9/bil11.txt
einstein/etext9/2ws271.txt
einstein/etext9/liber11.txt
einstein/etext0/bib0010h/Readme.txt
einstein/etext0/kknta10.txt

我无法使用 du 或其他高级命令。在某些时候我需要使用查找,我尝试过这样的事情

find -depth - type f -name "*.$extension" | sort ....

但这并没有很好地工作,因为我真的不知道如何按大小对它们进行排序,我得到的结果只是按名称排序。

我正在寻找类似于 ls -lhS 但包含子目录的输出。

答案1

AFAIK中的任何一个可以执行的唯一排序find是让内容出现在包含目录之前(选项-depth)。您将需要使用其他东西来按大小排序。

如果您有 GNU 查找,请尝试:

find . -type f -iname "*.$extension" -printf "%s %p\n" | sort -n | sed 's/^[0-9]* //'

-printf "%s %p\n"打印大小和文件路径,然后我们按数字排序,然后使用 剥离大小sed

答案2

我用

   find . -type f -iname "*.$extension" -print0 | xargs -0 ls -lS

这对我来说很好用

答案3

zsh

printf '%s\n' **/*.$extension(D.oL)

要获得 GNUls -lh类型的输出,请使用 GNU ls

ls -Ulhd -- **/*.$extension(D.oL)

或者如果列表太大:

autoload zargs # best in ~/.zshrc
zargs --eof= -- **/*.$extension(D.oL) '' ls -Ulhd --

或者

printf '%s\0' **/*.$extension(D.oL) | xargs -r0 ls -Ulhd --

如果由于某种原因,您确实需要使用find,您可以随时执行以下操作:

printf '%s\0' ./**/*.$extension(D.oL) | xargs -r0 sh -c '
  exec find "$@" -prune ...' sh

答案4

除了穆鲁的回答

您可以使用-exec du '{}' ';'代替-printf "%s %p"并仍然产生相同的格式。所以最终的命令就像

find . -type f -iname "*.$extension" -exec du '--' '{}' ';' | sort -n | sed 's/^[0-9]* //'

的解释-exec du '-b' '--' '{}' ';'

  1. -exec标志告诉find执行命令(即du),{}参数中出现的内容替换为文件路径
  2. '-b'告诉du命令输出字节数而不是千字节
  3. '--'是一个(标志?我需要有关其名称的帮助),它表示选项结束,其余参数是位置参数。需要此操作的一个示例是使用模糊命名为选项的文件执行任何操作,例如-whatever
  4. '{}'回到第 1 点,find将其替换为文件路径
  5. ";"告诉find命令参数-exec已结束并且可以正常处理其余参数

相关内容