递归删除小于1MB的文件


Answers:


21

这可以通过以下方式完成find

find . -type f -size -1M -exec rm {} +

请注意,这将递归地下降到子目录中,并且将无条件删除所有小于1 MB的文件。小心。


您缺少路径参数find

@Useless:那是GNU find。:)
Sven Marnach 2012年

2
@DanielAndersson:与相比,find限制了被调用进程的参数数量以适合系统的限制rm *,而后者被保证是单个进程调用。 如有必要,find将调用的多个实例rm。而且我非常确定特殊字符(包括换行符)会得到正确处理。我喜欢-exec rm-delete的灵活性的原因-作为一个例子,后者的报价没有办法删除写保护的文件。
Sven Marnach 2012年

1
@Invoker:由于您的更改不正确,我撤消了您的更改。 -1M表示小于所需的1兆字节。您的版本将删除大小恰好为1兆字节的所有文件,这似乎是没有意义的操作。
Sven Marnach

2
对于有兴趣的人,如果要删除所有大于 1M的文件,请使用命令find . -type f -size +1M -exec rm {} +。请注意+ 1M,而不是-1M。
15

10

这应该可以完成以下工作:

$ find <directory> -type f -size -1M -delete

我认为我们不需要从1M中删除连字符。
Invoker 2015年

2
@Invoker,我相信该-符号是减号,表示“小于1M”。如果运行find <directory> -type f -size +1M -delete,将删除所有大于 1M的文件。
Chessofnerd

是的,您说得对,我的错
Invoker

2

仅出于多样性和可能的​​(可能是边际的)性能提升:

find <directory> -type f -size -1M -print0  | xargs -0 rm

应该如何更快?它开始一个附加xargs过程。
Sven Marnach'2

现在,您可以有两个 CPU争用同一块设备!更明智的是,stat / readdir操作不会被unlink操作同步阻止。这是否可能更好,显然取决于子树的大小,文件数,设备等


-1

您可以查看此链接http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/,它正是您想要的。

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

您可以使用for循环遍历所有文件,然后像上面的示例一样使用du和awk查找文件大小。


关于SO的答案应该是独立的-不要仅仅发布链接。(此外,链接的帖子中的代码删除了空文件,而不是小于1M的文件。)
Sven Marnach 2012年

@SvenMarnach我们不能在给定的代码示例链接中使用$ file_size <1M。

不,我们不能,因为外壳不了解1M
Sven Marnach 2012年

1M意味着1048576将1MB转换为字节

1
好吧,如果您测试这是否确实有效并将代码复制到您的答案中,则可能会成为SO答案。
Sven Marnach 2012年
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.