如何从所有子目录中删除文件,但不从隐藏目录中删除?

时间:2012-02-14 13:32:30

标签: perl bash shell scripting

我想只删除所有子目录中的文件,但不删除以.开头的隐藏目录中的任何文件。例如:

Directory
├── file1
├── file2
├── .hidden directory
│   ├── log
│   └── txt
└── subdir
    ├── file a
    └── file b

如何删除file1file2file afile b?这不应该删除logtxt

3 个答案:

答案 0 :(得分:3)

这是一张带find

的单行班次
find . -path "*/.*" -prune -o \( -type f -exec rm {} + \)

实施例

$ find .
.
./.hidden
./.hidden/log
./.hidden/txt
./file1
./file2
./subdir
./subdir/filea
./subdir/fileb

$ find . -path "*/.*" -prune -o \( -type f -exec rm {} + \)

$ find .
.
./.hidden
./.hidden/log
./.hidden/txt
./subdir

答案 1 :(得分:1)

这里有一个小小的子工作:

sub clean_dir
{
    my $dir = shift;
    require File::Spec;

    if ($dir && -d $dir && opendir(DIR, $dir))
    {
        my @all = grep { -d (File::Spec->join($dir, $_) && m/^\./) } readdir(DIR);
        @all    = map { File::Spec->join($dir, $_) } @all;
        closedir(DIR);
        foreach my $f (grep { -f $_ } @all) {
            unlink($f);
        }
        foreach my $d (grep { -d $_ } @all) {
            clean_dir($d);
        }
    }
}

File::Spec用于正确处理元素分隔字符,即“/”,“\”或系统上使用的任何其他字符。

答案 2 :(得分:1)

一种方式:

运行脚本之前的文件树:

ls -1aR Directory/

输出:

Directory/:
.
..
file1
file2
.hidden
subdir

Directory/.hidden:
.
..
log
txt

Directory/subdir:
.
..
filea
fileb

script.pl的内容:

use warnings;
use strict;
use File::Find;

die qq[Usage: perl $0 <directory>\n] unless @ARGV == 1;

die qq[Argument must be a directory\n] unless -d $ARGV[0];

find( \&wanted, $ARGV[0] );

sub wanted {
        if ( -d && m/\A\.[^.]/ ) {
                $File::Find::prune = 1;
                return;
        }

        if ( -f ) {
                unlink $_ or warn qq[Cannot delete $File::Find::name\n];
        }
}

运行脚本:

perl script.pl Directory

运行脚本后的文件树

Directory/:
.
..
.hidden
subdir

Directory/.hidden:
.
..
log
txt

Directory/subdir:
.
..