通过命令行删除大小为0字节的文件?


16

因此,我有一个充满其他目录的目录,我想知道是否可以删除没有大小的文件。通常,这些文件为0字节,并且由于我想合并所有这些子目录,所以我可以用一个失重的0字节文件替换一个完全合法的文件,然后继续我的合法文件。有什么办法可以删除零字节文件?

Answers:


34

使用“ 查找”命令可按大小查找文件,并将文件名打印到标准输出。

find . -type f -size 0b -print

替代-print-delete删除的文件,而不是将它们打印在屏幕上。

find . -type f -size 0b -delete

现在,是否有任何方法可以将文件从一个位置移动到另一个位置,并且如果大小相同则替换冲突,但是如果大小不同则保留两个副本?
user245115 2015年

这听起来像是rsync的工作。

7
您可以使用-empty代替-size 0b
凯文

6

递归查找和删除所有大小为0的文件:

find . -type f -size 0 -print0 | xargs -I{} -0 rm {}

例:

% ls -og   
total 4
-rw-rw-r-- 1 0 Jun  7 20:31 bar
-rw-rw-r-- 1 5 Jun  7 20:29 foo

% find . -size 0 -print0 | xargs -I{} -0 rm {}

% ls -og                                      
total 4
-rw-rw-r-- 1 5 Jun  7 20:29 foo

4

您也可以直接在外壳中执行此操作。如果您不想删除空的隐藏文件(名称以开头的文件),这可能会很有用.。尽管您也可以做到这find一点,但是另一种方法是使用外壳程序本身:

shopt -s globstar
for file in **/*; do [ ! -s "$file" ] && [ -f "$file" ] && rm "$file"; done

说明

  • shopt -s globstar:打开bash的globstar选项,使**匹配一个或多个子目录。**/*将匹配当前目录及其所有子目录中的所有文件和目录。
  • for file in **/*; do ...; done :遍历找到的所有文件和目录;
  • [ ! -s "$file" ][ -s "$file" ]如果文件存在且不为空,则为true。因此,如果文件不存在或为空,则[ ! -s "$file" ](与!测试相反)为true。
  • [ -f "$file" ]:如果文件是常规文件,则为true。不是目录,设备文件或符号链接等。
  • rm "$file" :删除文件。

&&确保如果前一个是成功的所以这只能删除空,普通文件的下一个命令只运行。


我以为,我的回答很复杂:) +1
AB

2

尽管以上大多数答案是正确的,但请查看以下命令:

大小为0字节的文件表示文件为空

尽管可以运行以下命令:

find . -type f -empty -delete

这将删除所有空文件。

您可以在删除之前先查看这些文件:

find . -type f -empty

在Ubuntu 14.04 LTS上,如果没有使用-type f-empty也会删除空目录。刚刚检查了手册页。
芦苇
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.