查找目录和子目录中的所有零字节文件
回答 4
浏览 16.5万
2013-03-29
如何找到目录及其子目录中的所有零字节文件?
我这样做了:
#!/bin/bash
lns=`vdir -R *.* $dir| awk '{print $8"\t"$5}'`
temp=""
for file in $lns; do
if test $file = "0"; then
printf $temp"\t"$file"\n"
fi
temp=$file
done
但是,我只在当前目录中得到结果,而不是子目录, 如果任何文件名包含空格,那么我只会得到第一个单词后跟制表符
您可能想阅读
man find
。
- alk 2013-03-29
下次我不会像这样重复,因为我在超级用户中发布了我在 stackoverflow 中的浏览器问题,但现在通过清除历史 cookie 和 ie 中的缓存解决了这个问题,所以我在这里再次询问
- Civa 2013-03-29
4 个回答
#1楼
已采纳
得票数 230
打印大小为 0 的 $dir 中及以下的所有文件的名称:
find "$dir" -size 0
请注意,并不是所有find
的实现都会默认产生输出,所以你可能需要这样做:
find "$dir" -size 0 -print
关于问题中的最后一环,有两点意见:
您可以通过遍历行来部分消除空格问题,而不是遍历字符串中的每个其他单词并查看替代值是否为零。例如:
printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
test "$size" -eq 0 && echo "$path"; done
请注意,如果ls输出的任何路径都包含新行,这在你的案例中就会失败,这加强了两点:不要解析ls
,要有一个合理的命名策略,不允许在路径中使用空格。
第二,要从循环中输出数据,没有必要为了echo
而将输出存储在一个变量中。如果你简单地让循环把它的输出写到stdout,你就达到了同样的目的,但避免了存储它。
我可以过滤 *.xml 以外的目录吗
- Civa 2013-03-29
还有一个方便的
-empty
选项。
- Wesley Baugh 2017-07-26
@WesleyBaugh 使用 -empty 选项,您还可以获得内部文件为零的目录
- Igor Scabini 2017-09-20
@IgorScabini 如果你想限制文件,你可以使用
-type f
来实现。
- Wesley Baugh 2017-09-20
#2楼
得票数 48
作为对上述答案的补充,:
如果你想删除这些文件
find $dir -size 0 -type f -delete
它没有必要一直删除所有大小为0的文件。
- Raghvendra 2017-01-16
那么,如何删除一个文件夹中大小为0的文件呢?
- Raghvendra 2017-01-16
-exec /bin/rm {} \;
或-exec /bin/rm {} +
在非GNU的find
实现上也可以工作,它不支持非标准的扩展-delete
。
- Gert van den Berg 2018-05-15
替代
find $dir -size 0 -type f -delete
的方法:find $dir -empty -type f -delete
- AxelS 2022-12-20
#3楼
得票数 9
不,你不需要麻烦grep了。
find $dir -size 0 ! -name "*.xml"
#4楼
得票数 5
Bash 4+测试 - 这是搜索大小为0的正确方法:
find /path/to/dir -size 0 -type f -name "*.xml"
搜索多个大小为0的文件扩展名:
find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)
注意:如果你去掉了 \(...\),结果将是所有符合这一要求的文件,因此忽略了大小为0的文件。