我开始学习 Linux bash 编程几个星期了,但一直遇到一个问题:如何获取多个目录的大小(保存在 .txt 文件中的路径),然后将目录路径、大小以及该目录占用的总大小写入另一个文件。我已经尝试过了,但我不确定:
totsize=0
while read -r diretory; do
size=$(du -ch "$directory")
echo "$diretory size: $size" > "$homedir/$filename2"
$totsize += $(du -c "$homedir/$diretorio")
done < "$homedir/diretories.txt"
sudo echo "total size: $totsize" >> "$homedir/$filename2"
提前致谢(抱歉我的英语不好)
答案1
当按名称处理文件或目录时,我强烈建议用空字节字符分隔它们,而不是用换行符。因为正式的文件名能包含换行符。因此您不应该列出以换行符分隔的目录列表。
无论如何,当您有此列表时,您可以使用它:
du -sch --files0-from=dirs.txt
-s
就像-d0
并且只会总结每个参数的总数。-c
计算总计。-h
以人类可读的格式完成所有操作。--files0-from=dirs.txt
从以空字节终止的给定文件中读取文件名/目录名。
使用您的列表,它看起来应该像这样(但文件名中包含换行符的缺陷):
tr '\n' '\0' <dirs.txt | du -sch --files0-from=-
答案2
使用find
与du
并重定向到文件>
sudo find /path/to/topDir -maxdepth 1 -type d -exec du -sh {} \; > output.txt
例子:
xieerqi:$ sudo find Desktop -maxdepth 1 -type d -exec du -sh {} \; > outputFile1.txt
[sudo] password for xieerqi:
xieerqi:$ cat outputFile1.txt
2.7G Desktop
69M Desktop/linux-kernel-4.1.0
1.1M Desktop/DOCS
6.8M Desktop/The comments that became a reporter’s death sentence | New York Post_files
4.0K Desktop/newdir
6.7M Desktop/IMAGES
12M Desktop/TIRES
504K Desktop/MSU-TEMPLATES
341M Desktop/PDFS
19M Desktop/java
要让此命令显示列表中特定目录的磁盘使用情况,您可以将 cat 和 xargs 与上述命令结合使用。例如,
cat dirList.txt | xargs -I dir sudo find dir -maxdepth 0 -type d -exec du -sh {} \;
有些目录你不是所有者,需要sudo
访问才能列出其磁盘使用情况,因此需要将其与 结合起来sudo sh -c
。让我演示一下,
xieerqi:$ sudo sh -c "cat dirList.txt | xargs -I dir find dir -maxdepth 0 -type d -exec du -sh {} \+"
[sudo] password for xieerqi:
2.7G /home/xieerqi/Desktop
11M /bin
5.5G /usr
xieerqi:$ cat dirList.txt
/home/xieerqi/Desktop
/bin
/usr
答案3
du
您可以使用以下命令获取目录的大小:
du -h -d 1 "path to parent directory"
-d:子目录的深度