某个程序有一个特定的目录用作临时/临时目录
例如。 /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的解决方案,因为这不是一次性的事情,我不想每次都手动执行此操作
答案 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。