현재 디렉토리 아래의 모든 레벨을 검색 할 때 어떻게 수행되는지 확인하려면 표준 도구 find2perl
의 출력을 고려하십시오.
$ find2perl . -type f -size 0c
#! /usr/bin/perl -w
eval 'exec /usr/bin/perl -S $0 ${1+"[email protected]"}'
if 0; #$running_under_some_shell
use strict;
use File::Find();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '.');
exit;
sub wanted {
my ($dev,$ino,$mode,$nlink,$uid,$gid);
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
-f _ &&
(int(-s _) == 0)
&& print("$name\n");
}
위의 코드를 실행
$ find2perl . -type f -size 0c | perl
은 SP를 사용하여 상황
my @files = grep -f $_ && -s _ == 0, glob "*";
print @files, "\n";
또는
print +(grep -f $_ && -z _, <*>), "\n";
와 print
단일 호출이 지식을 적응과 가장 최근의 stat
결과의 캐시 된 사본을 보유하고있는 파일 핸들 _
은 충분할 운영 체제에 두 개의 트랩을 만들지 않습니다. zero-size check--s _ == 0
또는 이 일부 파일 시스템의 빈 디렉토리에 대해 true를 반환 할 것이므로 파일이 일반 파일 (-f
)인지 확인하십시오.
펄에서 일을하는 또 다른 방법 :이 파일의 일부가 I로 존재 사실에 대해 아무것도 인쇄했지만, 난 알고 이미 손으로 그들을 발견했다. –
아!을 (괄호)로 바꿨고 코드가 작동했습니다! –
스푸트니크는'while (<*>)' – ikegami