我有几个文件夹中的文件:
/home/d/folder1/a.txt
/home/d/folder1/b.txt
/home/d/folder1/c.mov
/home/d/folder2/a.txt
/home/d/folder2/d.mov
/home/d/folder2/folder3/f.txt
如何衡量/ home / d /中所有.txt文件占用的磁盘空间总量?
我知道 du会给我一个给定文件夹的总空间,而 ls -l会给我个别文件的总空间,但是如果我想要的话添加所有txt文件,只查看/ home / d /中所有.txt的所有.txt文件占用的空间,包括folder1和folder2及其子文件夹,如folder3 ?
答案 0 :(得分:39)
find folder1 folder2 -iname '*.txt' -print0 | du --files0-from - -c -s | tail -1
答案 1 :(得分:19)
这将按扩展名报告磁盘空间使用情况:
find . -type f -printf "%f %s\n" |
awk '{
PARTSCOUNT=split( $1, FILEPARTS, "." );
EXTENSION=PARTSCOUNT == 1 ? "NULL" : FILEPARTS[PARTSCOUNT];
FILETYPE_MAP[EXTENSION]+=$2
}
END {
for( FILETYPE in FILETYPE_MAP ) {
print FILETYPE_MAP[FILETYPE], FILETYPE;
}
}' | sort -n
输出:
3250 png
30334451 mov
57725092729 m4a
69460813270 3gp
79456825676 mp3
131208301755 mp4
答案 2 :(得分:11)
简单:
$ du -ch * .txt。
如果您只是想要显示的总空间,那么:
$ du -ch * .txt |尾-1
答案 3 :(得分:5)
这是一种方法,避免使用bad practice:
total=0
while read line
do
size=($line)
(( total+=size ))
done < <( find . -iname "*.txt" -exec du -b {} + )
echo $total
如果要排除当前目录,请将-mindepth 2
与find
一起使用。
可能更符合POSIX标准的另一个版本:
find . -iname "*.txt" -exec du -b {} + | awk '{total += $1} END {print total}'
答案 4 :(得分:3)
这样做:
total=0
for file in $(ls *.txt)
do
space=$(ls -l $file | awk '{print $5}')
let total+=space
done
echo $total
答案 5 :(得分:3)
<强> MACOS 强>
du
和参数-I
排除所有其他文件<强> 的Linux 强>
-X, --exclude-from=FILE
exclude files that match any pattern in FILE
--exclude=PATTERN
exclude files that match PATTERN
答案 6 :(得分:2)
GNU find,
find /home/d -type f -name "*.txt" -printf "%s\n" | awk '{s+=$0}END{print "total: "s" bytes"}'
答案 7 :(得分:2)
在ennuikiller的基础上,这将处理名称中的空格。我需要这样做并得到一些报告:
find -type f -name“* .wav”| grep导出| ./calc_space
#!/bin/bash
# calc_space
echo SPACE USED IN MEGABYTES
echo
total=0
while read FILE
do
du -m "$FILE"
space=$(du -m "$FILE"| awk '{print $1}')
let total+=space
done
echo $total
答案 8 :(得分:2)
对于那些在bash上使用GNU工具的人来说:
for i in $(find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u); do echo "$i"": ""$(du -hac **/*."$i" | tail -n1 | awk '{print $1;}')"; done | sort -h -k 2 -r
您必须启用extglob:
shopt -s extglob
如果您想要点文件,则必须运行
shopt -s dotglob
示例输出:
d: 3.0G
swp: 1.3G
mp4: 626M
txt: 263M
pdf: 238M
ogv: 115M
i: 76M
pkl: 65M
pptx: 56M
mat: 50M
png: 29M
eps: 25M
等
答案 9 :(得分:0)
我喜欢将find与xargs结合使用:
find . -name "*.txt" -print0 |xargs -0 du -ch
如果您只想查看总计
,请添加尾部find . -name "*.txt" -print0 |xargs -0 du -ch | tail -n1
答案 10 :(得分:0)
我的解决方案,以获取给定路径和子目录中所有文本文件的总大小(使用perl oneliner)
find /path -iname '*.txt' | perl -lane '$sum += -s $_; END {print $sum}'
答案 11 :(得分:0)
对于希望在命令行上使用macOS进行操作的任何人,您都需要基于-print0参数而不是printf的变体。上面的一些答案可以解决这个问题,但这可以通过扩展来全面实现:
find . -type f -print0 | xargs -0 stat -f "%N %i" |
awk '{
PARTSCOUNT=split( $1, FILEPARTS, "." );
EXTENSION=PARTSCOUNT == 1 ? "NULL" : FILEPARTS[PARTSCOUNT];
FILETYPE_MAP[EXTENSION]+=$2
}
END {
for( FILETYPE in FILETYPE_MAP ) {
print FILETYPE_MAP[FILETYPE], FILETYPE;
}
}' | sort -n
答案 12 :(得分:0)
接受的答案有几个潜在的问题:
globstar
之类的非标准shell功能)ls
与proposed by ghostdog74一样,您可以对-printf
使用特定于GNU的find
选项,以获得更可靠的解决方案,避免所有多余的管道,子shell,Perl和奇怪的{{ 1}}选项:
du
是的,是的,使用# the '%s' format string means "the file's size"
find . -name "*.txt" -printf "%s\n" \
| awk '{sum += $1} END{print sum " bytes"}'
或paste
的解决方案也是可行的,但没有任何更直接的方法。
在macOS上,您需要使用Homebrew或MacPorts安装bc
,然后调用findutils
。 (我在这个问题上请参见“ linux”标签,但它也被标签为“ unix”。)
没有GNU gfind
,您仍然可以退回到使用find
:
du
…但是,您必须注意以下事实:由于历史原因,find . -name "*.txt" -exec du -k + \
| awk '{kbytes+=$1} END{print kbytes " Kbytes"}'
的默认输出位于 512字节块中(请参见“ RATIONALE”部分{{3} }),而某些版本的du
(尤其是macOS)甚至没有具有以字节为单位打印大小的选项。
这里还有许多其他好的解决方案(尤其是参见here),但是大多数解决方案都具有不必要的复杂性或过于依赖纯GNU功能的缺点-也许在您的环境中,可以!