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

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

因此,我得到了一个目录,里面充满了其他目录,我想知道是否可以删除没有大小的文件。通常这些文件是 0 字节,由于我想合并所有这些子目录,我可以用无重量的 0 字节文件替换完全合法的文件,这样我的合法文件就消失了。有什么方法可以删除零字节文件吗?

答案1

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

find . -type f -size 0b -print

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

find . -type f -size 0b -delete

答案2

递归查找并删除所有大小为 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

答案3

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

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" ]如果文件存在且不为空,则为真。因此,如果文件不存在或为空,则[ ! -s "$file" ](测试的逆)为真。!
  • [ -f "$file" ]:如果文件是常规文件,则为 true。不是目录、设备文件或符号链接等。
  • rm "$file":删除文件。

确保&&仅当前一个命令成功时才运行下一个命令,因此这只会删除空的常规文件。

答案4

尽管上面的大多数答案都是正确的,但请看一下这个命令:

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

但你可以运行这个命令:

find . -type f -empty -delete

这将删除所有空文件。

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

find . -type f -empty

相关内容