我正在寻找一个脚本,该脚本列出目录和子目录中的所有文件(按大小排序),仅列出文件名而不列出完整路径。
find . -type f -exec ls -lhS {} \+
有效但给出了路径。
find . -type f -printf '%f\n'
也有效,但我不确定如何对其进行排序,或者是否也可以在此处包含文件大小。
答案1
如果您find
支持它,您可以使用%s
in -printf
(“文件大小以字节为单位”)。
如果您sort
支持空分隔输入 ( -z
),则可以执行以下操作:
find . -type f -printf "%s %f\0" | sort -nz | tr '\0' '\n'
答案2
如果您的系统支持zsh
命令,那么bash
您可以在脚本中运行
zsh -c 'ls -lhS -- **/*(.D)'
这可能需要一些解释:
zsh
:除此之外bash
,更强大的 shell 具有很多功能-c
:将下一个参数作为要执行的命令zsh
ls -lhS
:根据你的问题这是你要执行的命令--
:处理可能以-
字符开头的奇怪文件名**
:全局匹配多个目录*
: 标准全局- 匹配这些目录中的所有文件()
:全局限定符指定应选择哪些文件以及选择顺序.
:我们仅选择纯文本文件(type f
相当于find
)D
:在结果中包含点文件(隐藏文件)
重新阅读问题后,我想您宁愿从结果中删除整个路径,而不仅仅是前导部分。这仍然可以通过以下方式完成zsh
:
print -l **/*(.OLDe:'reply=${REPLY##*/}':)
但这可能有点太多了,因为这zsh
毕竟不是关于技巧的问题,所以我将建议使用find
+ 的“标准”解决方案sed
:
find . -type f -exec sh -c 'ls -lhS "$@" | sed "s| \..*/| |"' {} \+