2011-10-11 7 views
4

공통 접두사와 접미어가 증가하는 HDFS 파일 목록이 있다고합시다. 예를 들어Hadoop & Bash : 파일 이름 일치 범위 삭제

part-1.gz, part-2.gz, part-3.gz, ..., part-50.gz 

디렉토리에 몇 개의 파일 만 남기고 싶습니다. 3 개의 파일이 필요합니다. 파일은 테스트에 사용되므로 파일 선택은 중요하지 않습니다.

다른 파일 47 개를 삭제하는 가장 빠른 방법 &은 무엇입니까? 여기

답변

14

몇 가지 옵션 : 새 폴더 위에 세 파일을 수동으로


이동 후 기존 폴더를 삭제합니다. fs -ls


잡아 파일 이름은 다음 다음을 RM은, 상위 N 당기십시오. 이것은 가장 견고한 방법입니다.

hadoop fs -ls /path/to/files 당신에게 단지 파일 이름을 (원하는 파일을 잡아 그에 따라 GREP을 조정)

hadoop fs -ls /path/to/files | grep 'part' | awk '{print $8}' 인쇄 LS 출력을 제공합니다.

hadoop fs -ls /path/to/files | grep 'part' | awk '{print $8}' | head -n47 for 루프로 상위 47

던져이를 잡고 그들을 RM은 :

hadoop fs -ls /path/to/files | grep part | awk '{print $8}' | head -n47 | xargs hadoop fs -rm 
: 대신에 대한 루프, 당신은 xargs 사용할 수의

for k in `hadoop fs -ls /path/to/files | grep part | awk '{print $8}' | head -n47` 
do 
    hadoop fs -rm $k 
done 

키이스에게 영감을 주신 덕분에

+1

'hadoop fs -ls | grep 부분 | awk '{print $ 8}'| 머리 -n47 | xargs -I {} hadoop fs -rm {}'아마도? – Keith

+0

보안을 위해, 항상 for 루프를 사용하고이''hadoop fs -rm/PATH .../$ file''와 같은 접두사 경로를 사용하면 다른 것을 제거 할 기회가 없습니다. –

1
ls part-*.gz | sed -e "1,3d" | xargs rm 
+1

hadoop은 기존의 ls/rm/etc와 다른 인터페이스를 가지고 있습니다. –

+0

응답 해 주셔서 감사합니다. 매우 유용합니다. 나는 HDFS에 더 중점을두기 위해 질문을 편집했다. – volni

+0

내 대답을 쓸 때 질문에 HDFS가 언급되지 않았습니다. 삭제해야합니까? – Keith

4

Bash?

보관하려는 파일과 그 이유는 무엇입니까? 그들의 이름은 무엇입니까?

$ rm !(part-[1-3].gz) 

파트 1.gz, 파트 2.gz, 및 파트 3.gz 제외한 모든 파일을 제거합니다 : 위의 예에서, 당신이 뭔가를 할 수 있습니다.

또한 같은 것을 할 수 있습니다 나열된 마지막 세 개의 파일을 제외한 모든 제거

$ rm $(ls | sed -n '4,$p') 

.

또한이 작업을 수행 할 수 있습니다 : 당신이 디렉토리에 수백 수백 개의 파일이있는 경우 안전

$ls | sed -n '4,$p' | xargs rm 

.

+0

처음 세 줄을 건너 뛰고 싶다면'sed -n '4, $ p''를 의미한다고 생각합니다. – pilcrow

+0

@pilcrow : 네 말이 맞아. 나는 오류를 바로 잡을 것이다. –

1

AWK :

ls part-*.gz|awk -F '[-\.]' '$2>3{print "rm "$0}' |sh 
3

당신이 계속해야 수행 처음 세 또는 마지막 세?

hadoop fs -ls | grep 'part-[0-9]*\.gz' | sort -g -k2 -t- | tail -n +4 | xargs -r -d\\n hadoop fs -rm 

모든하지만 마지막 세 제거하려면 :

은 처음 세 남기고 모두 제거하려면이 명령은 파일의 실제 수에 의존하지 않는

hadoop fs -ls | grep 'part-[0-9]*\.gz' | sort -g -k2 -t- | head -n -3 | xargs -r -d\\n hadoop fs -rm 

주,도 3 개 이상 존재하거나 원래 리스팅의 정확한 정렬에 관한 정보는 없지만 숫자가 하이픈 다음에 오는 사실에 의존합니다. xargs의 매개 변수는 꼭 필요한 것은 아니지만 특정 상황에서 유용 할 수 있습니다.