복붙노트

[HADOOP] Hadoop 및 Bash : 파일 이름 일치 범위 삭제

HADOOP

Hadoop 및 Bash : 파일 이름 일치 범위 삭제

공통 접두사와 증가하는 접미사를 사용하여 HDFS에있는 파일 목록을 가지고 있다고 가정 해보십시오. 예를 들어,

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

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

47 개의 다른 파일을 삭제하는 가장 간단하고 빠른 방법은 무엇입니까?

해결법

  1. ==============================

    1.몇 가지 옵션 :

    몇 가지 옵션 :

    3 개의 파일을 수동으로 새 폴더로 이동 한 다음 이전 폴더를 삭제하십시오.

    fs -ls로 파일 이름을 잡은 다음 맨 위 n을 당긴 다음 rm을 붙입니다. 이것은 가장 견고한 방법입니다.

    hadoop fs -ls / path / to / files는 ls 출력을줍니다.

    hadoop fs -ls / path / to / files | grep '부분'| awk '{print $ 8}'는 파일 이름 만 출력합니다 (grep을 적절히 조정하여 원하는 파일을 가져옵니다).

    hadoop fs -ls / path / to / files | grep '부분'| awk '{print $ 8}'| 머리 - n47는 정상 47를 움켜 잡는다

    이것을 for 루프와 rm에 던지십시오.

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

    for-loop 대신 xargs를 사용할 수 있습니다.

    hadoop fs -ls /path/to/files | grep part | awk '{print $8}' | head -n47 | xargs hadoop fs -rm
    

    영감을 얻은 Keith에게 감사드립니다.

  2. ==============================

    2.배시?

    배시?

    유지하고 싶은 파일과 그 이유는 무엇입니까? 그들의 이름은 무엇입니까? 위의 예에서 다음과 같이 할 수 있습니다.

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

    Part-1.gz, part-2.gz 및 part-3.gz를 제외한 모든 파일이 제거됩니다.

    다음과 같이 할 수도 있습니다.

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

    나열된 마지막 세 파일을 제외한 모든 파일이 제거됩니다.

    당신도 이것을 할 수 있습니다 :

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

    디렉토리에 수백, 수백 개의 파일이 있다면 어느 것이 더 안전합니다.

  3. ==============================

    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에 대한 매개 변수는 꼭 필요한 것은 아니지만 특정 상황에서 유용 할 수 있습니다.

  4. ==============================

    4.

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

    5.awk :

    awk :

      ls part-*.gz|awk -F '[-\.]' '$2>3{print "rm "$0}' |sh
    
  6. from https://stackoverflow.com/questions/7733096/hadoop-bash-delete-filenames-matching-range by cc-by-sa and MIT license