shell 如何按文件大小排序查找结果

3lxsmp7m  于 12个月前  发布在  Shell
关注(0)|答案(6)|浏览(196)

如何按文件大小对find命令的结果进行排序?
我尝试对find命令的结果进行排序:

find ./src -type f -print0

我不想目录的大小,我需要的文件相对路径排序的大小只。

eblbsuwk

eblbsuwk1#

下面是如何使用find命令**:

find . -type f -exec ls -al {} \; | sort -k 5 -n | sed 's/ \+/\t/g' | cut -f 9

下面是如何使用递归ls命令**:

ls -lSR | sort -k 5 -n

或者,如果您只想显示文件名:

ls -lSR | sort -k 5 -n | sed 's/ \+/\t/g' | cut -f 9
ep6jt1vc

ep6jt1vc2#

解析 ls 或其变体将增加不确定的复杂性。

按文件大小排序文件路径:

find src -type f -printf '%s\t%p\n' | sort -n | cut -f2-

备注:

  • sort -n更改为sort -nr以获得相反的顺序
  • 这个问题有-print0,但照顾文件名包含换行符似乎迂腐。
  • 问题中提到了相对路径,将%p更改为%P将得到src/下的相对路径
nhaq1z21

nhaq1z213#

find -type f -exec du -sm {} \; | sort -nk1

大小以MiB为单位,路径是相对的。

juud5qan

juud5qan4#

find /folder -type f -exec ls -S {} +

我用的不是-exec ... \;,而是-exec ... {} +。这个构造并不提取找到的每个文件,而是等待所有文件都被找到,然后将它们作为一个大的参数列表放到一个命令(这次是-ls)中。然后ls正在查看文件,因为键-S按大小排序,最大的优先。

ruarlubt

ruarlubt5#

find -type f -printf '%s %p\n' | numfmt --to=iec | sort -h
  • find -type f递归查找当前目录下的所有文件
  • -printf '%s %p\n':对于每个文件,它打印文件大小(以字节为单位)和文件名(以空格分隔),并带有换行符
  • numfmt --to=iec将第一个字段(文件大小)格式化为人类可读格式(带有K、M、G后缀),并保持文件名不变
  • sort -hr按数字顺序对所有行进行排序,理解人类可读的后缀
bejyjqdl

bejyjqdl6#

从字面上看,这些答案实际上都不起作用。
这是我做的

#!/bin/bash
################# ls-by-min ################
##  List By Min File Size                 ##
##  Copyright (c) 2020 Theodore R. Smith  ##
##  License: MIT                          ##

if [ -z "$1" ]; then
    echo "Error: You must specify a minimum file size (in MB)."
    exit 1
fi

FILE_SIZE=$1

if [ "$2" = "-r" ]; then
    MAXDEPTH=512
else
    MAXDEPTH=1
fi

find . -maxdepth ${MAXDEPTH} -type f -size "+${FILE_SIZE}M" -exec du -sm {} \; | sort -rnk1 | sed 's/^[0-9]\+\t*//g'

https://github.com/hopeseekr/BashScripts/blob/master/ls-by-min
你可以通过执行以下操作来运行它:

ls-by-min 100 [-r]

并且它将按从大到小的顺序列出当前目录中100 MB或更大的文件。传入-r以使其递归。

相关问题