데이터 생성 스크립트를 너무 오래 실행하면 이제 약 1000 개로 압축해야하는 200,000 개 이상의 파일이 있습니다. Linux 명령 줄에서이 파일 중 1000 개를 제외한 모든 파일을 삭제하는 쉬운 방법이 있습니까? 파일 이름이나 다른 속성에 의존하지 않습니까?
데이터 생성 스크립트를 너무 오래 실행하면 이제 약 1000 개로 압축해야하는 200,000 개 이상의 파일이 있습니다. Linux 명령 줄에서이 파일 중 1000 개를 제외한 모든 파일을 삭제하는 쉬운 방법이 있습니까? 파일 이름이나 다른 속성에 의존하지 않습니까?
답변:
암호:
find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm
설명:
/path/to/dir을 find;
print0: 라인 구분 기호로 \0( null 문자 )를 사용하십시오. 공백 / 줄 바꿈이 포함 된 파일 경로는 스크립트를 손상시키지 않습니다.sort;로 파일 목록을 섞습니다 .
-z: \0( \n줄 바꾸기) 대신 (널 문자)를 구분 기호로 사용하십시오.-R: 무작위 순서tail;
-z: 목록을 0으로 구분하여 처리합니다 (와 동일 sort)-n +1001: 1001에서 시작하는 행을 표시합니다 (즉, 첫 1000 행을 생략).xargs -0 rm -나머지 파일을 제거하십시오.
-0: 다시 0으로 구분quixotic의 솔루션 보다 나은 이유 * :
find.find끝나지 않는 경우 파일 누락을 방지합니다 \n.* -에 신용 돈키호테 를위한 | sort -R | head -1000, 나에게 시작 지점을했다.
find . -type f | sort -R | tail -n +1001 | xargs rm
find있습니까? 나는 대답을 개선하려고 노력할 것입니다.
tail: invalid option -- 'z'내가 가진 꼬리의 버전은 8.4
임시 디렉토리를 사용한 다음 find모든 파일을 사용하고을 사용하여 목록을 무작위 화하고 목록 sort의 상위 1000 개를 임시 디렉토리로 이동하십시오. 나머지를 삭제 한 다음 임시 디렉토리에서 파일을 다시 이동하십시오.
$ mkdir ../tmp-dir
$ find . -type f | sort -R | head -1000 | xargs -I "I" mv I ../tmp-dir/
$ rm ./*
$ mv ../tmp-dir/* .
경우 xargs선 길이에 대해 불만을 가진 작은 번호를 사용 head(즉, 변화와 필요에 따라 명령을 반복 -1000하는 -500에 두 번 실행, 또는 변경 -2005 회를 실행하십시오.)
또한 공백이 포함 된 파일 이름을 처리하지 못합니다. 로 RLD의 응답 @ 쇼, 당신은 사용할 수 find의 -print0인수를 -z인수를 sort하고 head,과 -0와 xargs적절한 파일 이름 처리를 보장하기 위해.
마지막으로 tmp-dir이미 존재하는 경우 존재하지 않는 디렉토리 이름을 대체해야합니다.
find공백 을 포함 하면 실패합니다 .