查找最大的文件或目录


10

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

输出可能如下:

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

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

Answers:


7

这是一个快速解决方法,请使用du + sort。尝试这个:

du -smc * | sort -n

这将忽略隐藏的文件,但这是另一个简单的解决方法:

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

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


谢谢。如果您会这么友好,我会对您的脚本感兴趣。
xralf 2011年

1
sort -nr如果您想要最大的价值,请使用此选项。
LawrenceC

3

要在下的任何位置列出文件/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

(示例说明了这三个命令之间的区别:如果有一个文件/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}'

谢谢。这些命令很有用,但我只对直接位于tmp下的文件和目录感兴趣,而不对子目录中的文件感兴趣
xralf 2011年

1
@xralf:然后仅使用第二种形式的du调用。
吉尔(Gilles)'所以

看起来不错,但使用forcefsck发布的MB和GB效果更好。
xralf 2011年

3

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

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


这是一个不错的简短解决方案,但它只打印目录。
xralf 2011年

哦,对不起,你是对的。我从来没有遇到过文件问题。Howewer,我发现了如何使它与文件一起使用:使用--all swicth。
rvs

伟大的正确解决方案。penguin359稍好一点,因为它以MB为单位显示大小。最好的方法是forcefsck的解决方案,但是他的解决方案会省略目录中的空格。
xralf 2011年

1

使用当前版本的gnu sort(并借用@ penguin359文件模式)

cd /tmp; du -sShc .[^.] .??* * | sort -h

使用较旧的版本

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

编辑:添加了-S参数du以不包括子目录。


我想直接由tmp(而不是子目录)下的文件和目录(内部数据的总大小)使用的磁盘空间。我的排序命令没有-h选项。
xralf 2011年

我不确定您是什么意思,因为您已经接受了使用相同文件模式选择的答案。编辑我的帖子,使其不包含子目录。如果您需要表观大小而不是实际使用的磁盘空间,则可以添加--apparent-size到du参数。
forcefsck

现在效果很好。我只需要查找GB,然后查找MB,但这不是问题。
xralf 2011年

我的单位字母顺序错误,现在已解决。如果要从大到小的顺序,请更改单位字母的顺序,并添加-r进行排序。
forcefsck

我注意到,它忘记了打印目录的大小(不带。前缀)
xralf

0

更新:我已经废弃了以前的脚本。这是一个新版本,使用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."* 
#

当您说所有文件和目录的大小时,是否表示每个项目在磁盘上占用的空间(例如,在我的Ubuntu ext4文件系统上,一个空目录占用4k的磁盘空间,而小于4k的文件则占用4k 。最小分配块为4k .. 您的意思是每个文件中的数据量,例如100(bytes ..)。对于目录,您是否想知道该目录中的文件数据总数。你想要的数据的大小,里面的文件,然后tree做到这一点。如果您想要使用磁盘空间,则du执行此操作(tree不总计目录)
Peter.O 2011年

'du'是更好的选择...我刚刚在中注意到man du,它也可以报告常规文件上的“表观文件大小” .... The apparent size of a file is the number of bytes reported by wc -c',或更一般地说,ls -l --block-size=1' or stat --format =% s'。例如,一个文件包含单词zoo' with no newline would, of course, have an apparent size of 3.
Peter.O,2011年

我想直接由tmp(而不是子目录)下的文件和目录(内部数据的总大小)使用的磁盘空间
xralf

抱歉,我还不了解shell脚本编写的阶段,因此我让其他用户来决定它的答案。感谢您的工作。我会在更好时学习。
xralf

0
find /tmp -exec du {} + | sort -nr | less 

首先显示最大的文件,这样您就可以q在看到足够的文件后立即使用它。

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.