我想只删除所有子目录中的文件,但不删除以.
开头的隐藏目录中的任何文件。例如:
Directory
├── file1
├── file2
├── .hidden directory
│ ├── log
│ └── txt
└── subdir
├── file a
└── file b
如何删除file1
,file2
,file a
和file b
?这不应该删除log
和txt
。
答案 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:
.
..