2014-11-16 2 views
-1

일부 프로그램에서 임시/스크래치 디렉토리로 사용되는 특정 디렉토리가 있습니다.
예. /a/b/c/work
여러 개의 계층 적 디렉토리가있을 수 있습니다.Perl 사용하기 파일이없는 디렉토리를 정리하는 방법은 무엇입니까?

/a/b/c/work/ 
      \d1/ 
       \d1.1 
      \d2 
       \d2.2 

내가 원하는 것은 공간을 차지하는 파일이 남기 때문에이 작업 디렉토리를 정리하는 것입니다.
기본적으로 리프 디렉토리가 비어있는 작업중인 모든 하위 디렉토리를 삭제해야합니다.
d1.1이 비어 있지만 d2.2에 파일이 있으면 d1 (d1 포함) 아래의 모든 것을 삭제하지만 d2는 삭제하지 않습니다.
perl에서 가장 깨끗하고 표준적인 방법은 무엇입니까?
예를 들어 백틱이있는 솔루션을 사용하려고 생각했습니다. rm -rf etc 그러나 나는 거기에 rm에 의해 folowed ls의 코드 시퀀스보다 좋은 방법이있을 수 있다고 생각

참고 : 그냥 분명히합니다. 나는 한 번에 할 일이 아니므로 Perl의 해결책을 원합니다. 매번 수동으로 해보고 싶지 않습니다.

답변

4

이렇게하면 find 명령을 사용하면 얻을 수 있습니다.

find /path/to/dir -empty -type d -delete 

,

-empty

만 빈 파일을 발견하고는 일반 파일이나 디렉토리에 있는지 확인합니다.

-type d 디렉토리 만 일치시킵니다.

-delete 파일을 삭제하십시오.

find 명령 줄이 표현식으로 평가 될 때 항상 find 명령 끝에 -delete 옵션을 입력하십시오. 따라서 -delete을 먼저 입력하면 지정한 시작 지점 아래의 모든 항목을 삭제하려고 시도합니다.

코드 아래의 사항을 지켜 쉘 스크립트에서이 작업을 자동화하려면, 다음과 같은 코드가 작업을 할 것입니다 경우에 myShell.sh /path/to/mydir 같은 쉘 스크립트의 인수로 특정 입력을 제공 할 수 있습니다

path=`pwd` 

find $path -empty -type d -delete 

또는

$path=$1 

find $path -empty -type d -delete 
당신이 정말로 펄 가고 싶은 경우

use strict; 
use warnings; 

use File::Util; 

my $path = '...'; 

my $fu   = File::Util->new(); 
my @all_dirs = $fu->list_dir($path, '--recurse', '--dirs-only'); 
my @empty_dirs = grep { not $fu->list_dir($_) } @all_dirs; 
을 다음과 같이 답을 찾을 수 있습니다에 대한

로 또한 15,

here 매우 좋은 설명 짧은 방법

perl -MFile::Find -e"finddepth(sub{rmdir},'.')" 

.

+0

1) 빈 부모 디렉토리가 모두 삭제됩니까? 2) 펄에서는 어떻게해야합니까? 그냥 백틱을 사용합니까? – Jim

+0

OP – Jim

+0

의 업데이트를 참조하십시오. 빈 디렉토리를 삭제할 디렉토리 경로를 설정해야합니다. @Jim Linux 쉘 요구 사항에 따라 요청했으면합니다. – Skynet

관련 문제