2013-08-06 4 views
2

내 폴더에서 비어있는 파일 (0 바이트)을 확인하려고합니다. 필자는 Perl이이 작업을 매우 쉽게 할 수 있도록 약 1,200 개의 파일을 가지고 있습니다 :)현재 디렉토리에 빈 파일의 이름을 어떻게 출력합니까?

여기까지는 내 코드이지만 작동하지 않는 것 같습니다. (그냥 모든 파일을 나열하고 있습니다.) 누구든지 내가 잘못한 것을 가르쳐 줄 수 있습니까? 감사!

#!/usr/bin/perl 
@files = glob('*'); 
if ((-s @files) == 0) { 
    print"@files\n"; 
} 

답변

1
#!/usr/bin/perl 

use strict; use warnings; 

foreach my $file (glob('*')) { 
    unless (-s $file) { 
     print "$file\n"; 
    } 
} 
+0

펄에서 일을하는 또 다른 방법 :이 파일의 일부가 I로 존재 사실에 대해 아무것도 인쇄했지만, 난 알고 이미 손으로 그들을 발견했다. –

+0

아! 을 (괄호)로 바꿨고 코드가 작동했습니다! –

+1

스푸트니크는'while (<*>)' – ikegami

5

당신은 하나의 검사를 수행 아직 여러 파일을 가지고있다. 분명히, 그것은 말이되지 않습니다. 루프를 추가하여 각 파일을 검사해야합니다. 버전에서

#!/usr/bin/perl 
use strict; 
use warnings; 
my @files = grep { -s $_ == 0 } glob('*'); 
    # or: grep { ! -s $_ } 
    # or: grep { -z $_ } 
    # or: grep { -z } 
    # or: grep -z, 
print "@files\n"; 

, 당신은 12라는 이름의 파일이든 @files의 원소의 개수의 크기를 얻을하려고합니다. 그 결과 -s은 세트로 undef을 반환했습니다.

-2

현재 디렉토리 아래의 모든 레벨을 검색 할 때 어떻게 수행되는지 확인하려면 표준 도구 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)인지 확인하십시오.

+0

OP가 재귀 적으로 검색하지 않으므로'-maxdepth 1'을 추가해야합니다. – ikegami

1

다른 모든 솔루션과 비슷한 솔루션을 권장하지만 -s 연산자 대신 -z 연산자를 사용하는 것이 좋습니다. 내 마음에

,

"파일의 길이가 제로가 아닌 않는"모두가 같은 부울 의미를 가지고 반대하지만, 이전의 코드 "파일 길이가 제로가"코드에 명확 귀하의 의도는보다 명확하게입니다. 그렇지 않으면, 당신이 얻은 해답은 모두 꽤 좋다.

#/run/my/perl 

use strict; 
use warnings; 
foreach my $file (glob("*")) { 
    print "$file\n" if -z $file; 
} 
1

아직 내가 이것을 실행하고 중/작동하지 않았다

use File::stat; 
foreach (glob('*')){ 
    print stat($_)->size,"\n" 
};  

# this will file sizes of all files and directories 
# you need to check if its a file and if size is zero 
관련 문제