【问题标题】:Using Perl how can I clean up left over directories with no files?使用 Perl 如何清理没有文件的剩余目录?
【发布时间】:2015-01-13 08:57:52
【问题描述】:

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

【问题讨论】:

    标签: linux perl file directory


    【解决方案1】:

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

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

    在哪里,

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

    -type d 只匹配目录。

    -delete删除文件。

    始终将 -delete 选项放在 find 命令的末尾,因为 find 命令行被评估为表达式,因此将 -delete 放在首位将使 find 尝试删除您指定的起点以下的所有内容。

    要在 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

    【讨论】:

    • 1) 这会删除所有空的父目录吗? 2)我如何在perl中做到这一点?只使用反引号?
    • 您必须设置要删除空目录的目录路径和@Jim,我希望您按照Linux shell要求询问。
    • 我需要自动执行此操作,而不是“监视”此目录并手动发出此命令,因为这不是一次性的。如果我的 OP 不清楚,我很抱歉
    • 您仍然可以使用 shell 脚本来确定当前目录,使用 pwd 并使用变量以 find 命令作为目标。我正在根据新更新的 OP 进行编辑。
    • 我不确定您所说的determine the current directory using pwd 是什么意思。我知道目录。必须删除以空叶层次结构结尾的子目录是 1 个特定的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2017-05-10
    • 2013-05-23
    相关资源
    最近更新 更多