Как удалить файлы из всех подкаталогов, но не из скрытых каталогов? - PullRequest
1 голос
/ 14 февраля 2012

Я хочу удалить только файлы из всех подкаталогов, но не удалять файлы из скрытых каталогов, начиная с ..Пример:

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

Как удалить file1, file2, file a и file b?Это не должно удалять log и txt.

Ответы [ 3 ]

3 голосов
/ 15 февраля 2012

Это 1-вкладыш с 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 голос
/ 14 февраля 2012

В одну сторону:

Дерево файлов перед запуском скрипта:

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:
.
..
1 голос
/ 14 февраля 2012

Вот небольшой саб, выполняющий работу:

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 используется для правильной обработки символа, разделяющего элементы, то есть «/», «\» или чего-либо еще используемого в вашей системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...