是否可以在Unix中使用ls
来列出子目录及其所有内容的总大小,而不是通常的4K(我假设)只是目录文件本身?即。
total 12K
drwxrwxr-x 6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk
在搜阅了这些手册页后,我空了。
答案 0 :(得分:1349)
尝试类似:
du -sh *
简短版:
du --summary --human-readable *
du
: D isk U sage
-s
:显示每个指定文件的摘要。 (相当于-d 0
)
-h
:“人类可读的”输出。使用单位后缀: B yte, K ibibyte(KiB), M ebibyte(MiB), G ibibyte( GiB), T ebibyte(TiB)和 P ebibyte(PiB)。 (BASE2)
答案 1 :(得分:290)
du -sk * | sort -n
将按大小对文件夹进行排序。想要清理空间时很有帮助..
答案 2 :(得分:92)
du -sh * | sort -h
这将以人类可读的格式显示。
答案 3 :(得分:41)
以人类可读格式列出当前目录中的最大目录:
du -sh * | sort -hr
限制行数的更好方法可以是
du -sh * | sort -hr | head -n10
您可以在其中增加-n
标志的后缀以限制列出的行数
示例:
[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M Vendor
1.1M composer.phar
488K phpcs.phar
488K phpcbf.phar
72K doc
16K nbproject
8.0K composer.lock
4.0K README.md
它使阅读更方便:)
答案 4 :(得分:23)
要以ls -lh
格式显示,请使用:
(du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }'
Awk代码解释:
if($1 == "total") { // Set X when start of ls is detected
X = 1
} else if (!X) { // Until X is set, collect the sizes from `du`
SIZES[$2] = $1
} else {
// Replace the size on current current line (with alignment)
sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0);
print $0
}
示例输出:
drwxr-xr-x 2 root root 4.0K Feb 12 16:43 cgi-bin
drwxrws--- 6 root www 20M Feb 18 11:07 document_root
drwxr-xr-x 3 root root 1.3M Feb 18 00:18 icons
drwxrwsr-x 2 localusr www 8.0K Dec 27 01:23 passwd
答案 5 :(得分:20)
您想要的命令是'du -sk'du =“磁盘使用情况”
-k标志为您提供以千字节为单位的输出,而不是磁盘扇区的du默认值(512字节块)。
-s标志仅列出顶级目录中的内容(即默认情况下的当前目录或命令行中指定的目录)。在这方面,du具有相反的ls行为,这很奇怪。默认情况下,du将递归地为您提供每个子目录的磁盘使用情况。相反,ls只会在指定目录中提供列表文件。 (ls -R为您提供递归行为。)
答案 6 :(得分:11)
将此shell函数声明放在shell初始化脚本中:
function duls {
paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}
我将其称为duls
,因为它显示du
和ls
的输出(按此顺序):
$ duls
210M drwxr-xr-x 21 kk staff 714 Jun 15 09:32 .
$ duls *
36K -rw-r--r-- 1 kk staff 35147 Jun 9 16:03 COPYING
8.0K -rw-r--r-- 1 kk staff 6962 Jun 9 16:03 INSTALL
28K -rw-r--r-- 1 kk staff 24816 Jun 10 13:26 Makefile
4.0K -rw-r--r-- 1 kk staff 75 Jun 9 16:03 Makefile.am
24K -rw-r--r-- 1 kk staff 24473 Jun 10 13:26 Makefile.in
4.0K -rw-r--r-- 1 kk staff 1689 Jun 9 16:03 README
120K -rw-r--r-- 1 kk staff 121585 Jun 10 13:26 aclocal.m4
684K drwxr-xr-x 7 kk staff 238 Jun 10 13:26 autom4te.cache
128K drwxr-xr-x 8 kk staff 272 Jun 9 16:03 build
60K -rw-r--r-- 1 kk staff 60083 Jun 10 13:26 config.log
36K -rwxr-xr-x 1 kk staff 34716 Jun 10 13:26 config.status
264K -rwxr-xr-x 1 kk staff 266637 Jun 10 13:26 configure
8.0K -rw-r--r-- 1 kk staff 4280 Jun 10 13:25 configure.ac
7.0M drwxr-xr-x 8 kk staff 272 Jun 10 13:26 doc
2.3M drwxr-xr-x 28 kk staff 952 Jun 10 13:26 examples
6.2M -rw-r--r-- 1 kk staff 6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
11M drwxr-xr-x 42 kk staff 1428 Jun 10 13:26 src
$ duls doc
7.0M drwxr-xr-x 8 kk staff 272 Jun 10 13:26 doc
$ duls [bM]*
28K -rw-r--r-- 1 kk staff 24816 Jun 10 13:26 Makefile
4.0K -rw-r--r-- 1 kk staff 75 Jun 9 16:03 Makefile.am
24K -rw-r--r-- 1 kk staff 24473 Jun 10 13:26 Makefile.in
128K drwxr-xr-x 8 kk staff 272 Jun 9 16:03 build
说明:
paste
实用程序根据您提供的规范从其输入创建列。给定两个输入文件,它将它们并排放置,并使用制表符作为分隔符。
我们将du -hs -- "$@" | cut -f1
的输出作为第一个文件(确实是输入流),将ls -ld -- "$@"
的输出作为第二个文件。
在函数中,"$@"
将计算所有命令行参数的列表,每个参数都用双引号括起来。因此,它将理解带有空格等的通配字符和路径名。
双重误差(--
)表示du
和ls
的命令行选项结束。如果没有这些,请说duls -l
会混淆du
du
ls
没有的任何选项会混淆ls
(以及两者中存在的选项)公用事业可能并不意味着同样的事情,而且会非常糟糕。
cut
之后的du
只会删除du -hs
输出的第一列(尺寸)。
我决定将du
输出放在左边,否则我将不得不管理一个摇摆不定的右列(由于文件名的长度不同)。
该命令不接受命令行标志。
已在bash
和ksh93
中对此进行了测试。它不适用于/bin/sh
。
答案 7 :(得分:7)
du -h --max-depth=1 . | sort -n -r
答案 8 :(得分:7)
我总是使用du -sk
(-k
标志显示文件大小,以千字节为单位)。
答案 9 :(得分:4)
du -sch *在同一目录中。
答案 10 :(得分:4)
这是我喜欢的
update :我不喜欢上一个,因为它没有在当前目录中显示文件,它只列出了目录。
ubuntu上/var
的示例输出:
sudo du -hDaxd1 /var | sort -h | tail -n10
4.0K /var/lock
4.0K /var/run
4.0K /var/www
12K /var/spool
3.7M /var/backups
33M /var/log
45M /var/webmin
231M /var/cache
1.4G /var/lib
1.7G /var
答案 11 :(得分:3)
这些都是很棒的建议,但我使用的是:
du -ksh * | sort -n -r
-ksh
确保文件和文件夹以人类可读的格式列出,并以兆字节,千字节等为单位。然后您按数字排序并反转排序,以便将较大的文件和文件夹放在第一位。
此命令的唯一缺点是计算机不知道技嘉大于兆字节,所以它只会按数字排序,你会经常找到这样的列表:
120K
12M
4G
小心看看单位。
此命令也适用于Mac(而sort -h
不适用)。
答案 12 :(得分:3)
du -S
du 还有另一个有用的选项:-S, --separate-dirs
告诉 du 不包含子目录的大小 - 在某些情况下很方便。
示例1 - 仅显示 目录中的文件大小:
du -Sh *
3,1G 10/CR2
280M 10
示例2 - 显示目录中的文件大小和子目录:
du -h *
3,1G 10/CR2
3,4G 10
答案 13 :(得分:3)
查看du
命令
答案 14 :(得分:3)
du -sm * | sort -nr
按大小输出
答案 15 :(得分:2)
只是一个警告,如果你想比较文件的大小。 du根据文件系统,块大小......产生不同的结果。
可能会发生文件大小不同的情况,例如比较本地硬盘和USB大容量存储设备上的相同目录。我使用以下脚本,包括ls来总结目录大小。结果以字节为单位考虑所有子目录。
echo "[GetFileSize.sh] target directory: \"$1\""
iRetValue=0
uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
iRetValue=-1
else
echo "[GetFileSize.sh] computing size of files..."
# use ls to compute total size of all files - skip directories as they may
# show different sizes, depending on block size of target disk / file system
uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
uiLength=$(expr length "$uiTotalSize")
if [ $uiLength -lt 1 ]; then
uiTotalSize=0
fi
echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""
fi
exit "$iRetValue"
答案 16 :(得分:2)
ncdu
导致du
这个很棒的CLI实用程序使您可以轻松地以交互方式查找大文件和目录。
例如,在a well known project树的内部,我们进行以下操作:
sudo apt-get install ncdu
ncdu
结果如下:
然后,我在键盘上向下和向右输入以进入/drivers
文件夹,然后看到:
ncdu
仅在启动时为整个树递归计算一次文件大小,因此效率很高。
“总磁盘使用量”与“表观大小”的比较类似于du
,我在以下网址进行了解释:why is the output of `du` often so different from `du -b`
项目主页:https://dev.yorhel.nl/ncdu
相关问题:
在Ubuntu 16.04中测试。
答案 17 :(得分:1)
嗯,最好的方法是使用这个命令:
du -h -x / | sort -hr >> /home/log_size.txt
然后,您将能够在所有服务器上获取所有大小的文件夹。很容易帮助您找到最大的尺寸。
答案 18 :(得分:1)
有一段时间,我使用Nautilus(在RHEL 6.0上的Gnome桌面上)删除我的主文件夹上的文件,而不是在bash中使用rm
命令。因此,
du -sh
当我使用时,与每个子目录的磁盘使用量之和不匹配
du -sh *
我花了一段时间才意识到Nautilus将已删除的文件发送到其Trash文件夹,并且该文件夹未在du -sh *
命令中列出。所以,只是想分享这个,以防有人遇到同样的问题。
答案 19 :(得分:1)
以递归方式显示当前目录的文件和子目录大小:
du -h .
要显示相同尺寸信息,但不用递归打印子目录(可能是一个巨大的列表),只需使用 - max-depth 选项:
du -h --max-depth=1 .
答案 20 :(得分:0)
我遇到了类似于Martin Wilde描述的问题,在我的情况下,在使用rsync镜像后比较两个不同服务器上的相同目录。
我没有使用脚本,而是将-b
标志添加到du
,它以字节为单位计算大小,并且我可以确定消除了两台服务器上的差异。您仍然可以使用-s -h
来获得可理解的输出。
答案 21 :(得分:0)
以下内容易于记忆
ls -ltrapR
列出目录内容
-l使用长列表格式
-t按修改时间排序,最新的
-r, - 反向 排序时的逆序
-a, - all 不要忽略以。开头的条目。
-p, - 指示符样式=斜杠 将/指标附加到目录
-R, - 递归 以递归方式列出子目录
答案 22 :(得分:0)
放置在.bashrc之类的初始化脚本中...根据需要调整def。
duh() {
# shows disk utilization for a path and depth level
path="${1:-$PWD}"
level="${2:-0}"
du "$path" -h --max-depth="$level"
}
答案 23 :(得分:0)
如果要对要在其上列出目录的size
进行更多控制,可以使用threshold
(-t
)开关,如下所示:
$ du -ht 1000000000 | sort --reverse
du
-d
isk u
鼠尾草
h
-可读格式
t
-阈值大小
在这里,我们要列出所有大于1GB的目录。
$ du -ht 1G | sort --reverse
说明:
described in wiki的单位如下:
K,M,G,T,P,E,Z,Y(1024的幂)或
KB,MB,GB,TB,PB,EB,ZB,YB(1000的幂)。
答案 24 :(得分:0)
仅从ls中检索字节大小。
ls -ltr | head -n1 | cut -d' ' -f2
答案 25 :(得分:0)
请务必注意,du
可以帮助您使用磁盘。不同的机器可以使用不同的块大小,因此,在一台机器上,一个块可能是4096字节,而另一台机器可能包含2048个块大小。如果我将10个1字节文件放入一台使用4096字节块的机器中,将10 1字节文件放入一台机器中如果使用2048个字节的块,du -h
将分别报告〜40k和〜20k。
如果您想知道目录中所有文件的大小,可以对每个目录执行以下操作:
for x in ./*;
do
if [[ -f "$x" ]]; then
ls -al "$x"
fi
done | awk '{print $6}' | awk '{s+=$1}END{print s}'
这将为您提供目录中所有文件的总大小。
答案 26 :(得分:0)
find . -maxdepth 1 -exec du --apparent-size --max-depth=0 --null '{}' ';' |\
sort -k1 -nr --zero-terminated |\
cut -f2 --zero-terminated |\
xargs --null -n 1 du -h --apparent-size --max-depth=0
特点:
--apparent-size
与 du
结合使用以获得类似于 ls
的行为。答案 27 :(得分:-1)
输入&#34; ls -ltrh / path_to_directory&#34;