여러 디렉터리에 대한 무작위 정렬 및 삭제(rm) 속도 향상

여러 디렉터리에 대한 무작위 정렬 및 삭제(rm) 속도 향상

기본적으로 BSD인 터미널에서 MacOS를 실행하므로 다른 질문 대신 여기에 질문을 게시합니다. 파일을 무작위로 삭제하여 후속 단계에서 이미지 데이터세트를 줄이고 싶습니다. 일부 디렉토리에는 1백만 개 이상의 jpg가 있습니다. 내 데이터는 최대 깊이가 1인 하위 디렉터리가 있는 마스터 디렉터리에 있습니다.

-master
     -data1
       image.jpgs
     -data2
       image.jpgs
     -data3
       image.jpgs
     -data4
       image.jpgs
... and so forth

다음 링크를 찾았습니다.

https://superuser.com/questions/1186350/delete-all-but-1000-random-files-in-a-directory

... 그리고 생각해낸 결과는 다음과 같습니다.

for f in *.jpg; do find "$f" -type f -print0 | sort -R | tail -n +50001 | xargs -0 rm; done

작동하는 동안 하위 디렉터리에 대해 이 작업을 반복적으로 수행하고 싶기 때문에 모든 디렉터리에 대해 수동으로 수행할 필요가 없습니다. 그래서 내 질문/요청은 다음과 같습니다.

  1. 속도를 높이기 위해 어떻게든 최적화할 수 있나요?
  2. 50,000개 미만의 파일이 있는 디렉터리를 발견하면 sort/tail이 오류를 반환합니까?

답변1

링크된 소스 게시물을 확인한 결과 루프가 실제로 다음과 같아야 합니다.

for d in */; do find "$d" -iname '*.jpg' -type f -print0 | sort -zR | tail -zn +50001 | xargs -0r rm; done

디렉토리 에서 실행됩니다 master.

입력이 널로 구분되므로 및 옵션 -z이 필요합니다. 라인 수가 50000개 미만이면 둘 다 불평하지 않습니다 . 50000번째 라인 이후에는 아무 것도 없기 때문에 상관하지 않고 아무 것도 출력하지 않습니다. 인수 없이 실행되는 것에 대해 불평할 수 있지만 GNU 옵션은 입력이 없으면 실행을 방지합니다 (BSD xargs에는 필요하지 않지만 불평하지 않을 것입니다).sorttailsorttailrm-rxargsrm

마지막으로 가장 중요한 점은 -z널 구분 입력 옵션이 BSD tail에서 지원되지 않을 것이라는 점입니다. homebrew를 사용하여 설치할 수 있는 GNU tail이 필요합니다.

파일 이름에 공백, 개행, 따옴표, 백슬래시 등이 포함되지 않는 것이 보장되는 경우 null로 구분된 줄 없이도 가능합니다. 이 경우:

for d in */; do find "$d" -type f | sort -R | tail -n +50001 | xargs rm; done

관련 정보