使用Perl如何清除没有文件的剩余目录?

时间:2014-11-16 10:18:17

标签: linux perl file directory

某个程序有一个特定的目录用作临时/临时目录 例如。 /a/b/c/work
在工作中,可能存在多个分层目录。

/a/b/c/work/  
            \d1/   
               \d1.1  
             \d2
                \d2.2  

我想要的是清理这个工作目录,因为留下了占用空间的文件 基本上我需要删除叶子目录为空的工作中的所有子目录 因此,如果d1.1为空,但d2.2有文件,则删除d1(包括d1)下的所有内容,但不删除d2。
perl中最干净/最标准的方法是什么? 我想用一个带反键的解决方案,例如rm -rf等,但我认为可能有一些更好的方法比rm的ls编码序列

注意:只是为了清楚。我想要一个Perl的解决方案,因为这不是一次性的事情,我不想每次都手动执行此操作

1 个答案:

答案 0 :(得分:4)

如果您以这种方式使用find命令,则可以实现它。

find /path/to/dir -empty -type d -delete

其中,

-empty只找到空文件并确保它是常规文件或目录。

-type d仅匹配目录。

-delete删除文件。

始终将-delete选项放在find命令的末尾,因为find命令行被计算为表达式,因此首先放置-delete会使find尝试删除指定起始点以下的所有内容。 / p>

要在shell脚本中自动执行此操作,请遵循以下代码:

path=`pwd`

find $path -empty -type d -delete

或者您可以提供某些输入作为shell脚本的参数,例如myShell.sh /path/to/mydir,在这种情况下,以下代码将完成工作,

$path=$1

find $path -empty -type d -delete

至于你是否真的想要使用perl,你可以找到你的答案如下

use strict;
use warnings;

use File::Util;

my $path = '...';

my $fu         = File::Util->new();
my @all_dirs   = $fu->list_dir($path, '--recurse', '--dirs-only');
my @empty_dirs = grep { not $fu->list_dir($_) } @all_dirs;

也是一种简短的方法

perl -MFile::Find -e"finddepth(sub{rmdir},'.')"

解释得非常好here