查找最大的文件或目录

查找最大的文件或目录

哪个命令将打印 tmp 目录中所有文件和目录(包括隐藏文件和目录)的大小,并以人类可读的格式(例如 2 GB)按大小从最大到最小对它们进行排序?

输出可能如下:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

我尝试使用lsdu命令,但无法找到正确的开关。

答案1

这是一个快速修复方法,使用 du + sort。尝试这个:

du -smc * | sort -n

这将忽略隐藏文件,但这是另一个简单的修复:

du -smc .[^.] .??* * | sort -n

如果上述一个或多个模式与文件不匹配,这可能会导致警告。第一个模式.[^.]匹配以 . 开头的所有两个字符文件名。除了 .. 之外,第二个模式.??*匹配以 .. 开头的所有三个字母或更多文件名。和 * 匹配所有不以 .对于更复杂的列表,例如在整个文件系统中查找大于 X 的所有文件,或维护文件系统增长列表,我编写了一些 DIY shell 脚本,如果您感兴趣,可以分享。

答案2

要列出 下任意位置的文件/tmp,按大小排序:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

要列出紧邻 下的文件和目录树/tmp,按大小排序:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

要列出 下任意位置的所有文件和目录树/tmp,按大小排序:

du -ak /tmp | sort -k1n -k2

(举例说明这三个命令之间的区别:如果有一个 file /tmp/dir/file,第一个命令列出/tmp/dir/file,第二个命令列出/tmp/dir,第三个命令列出两者。)

上面的所有命令都显示大小(以千字节为单位)。虽然 GNU du 可以输出“人类可读”的大小(带有 k、M、G 等乘数),但对它们进行排序是另一回事。最近足够多的 GNU coreutils (≥7.4) 可以做到这一点:只需替换du -kdu -hsort -k1n -k2sort -k1h -k2否则,这里有一个粗略的 awk 脚本,用于转换为后缀大小(向下舍入);只需将sort上面的输出通过管道传输到其中即可。

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

答案3

我使用以下别名:alias ds='du -x --all --max-depth=1 . | sort -n'

它打印当前目录的所有文件和第一级子目录的大小。

答案4

更新:我已经废弃了之前的脚本。这是一个新版本,使用 duawk (之前的版本使用treesed

这是以下内容的输出:dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

这是脚本

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

相关内容