디렉토리에서 1000 개의 무작위 파일을 제외한 모든 파일 삭제


13

데이터 생성 스크립트를 너무 오래 실행하면 이제 약 1000 개로 압축해야하는 200,000 개 이상의 파일이 있습니다. Linux 명령 줄에서이 파일 중 1000 개를 제외한 모든 파일을 삭제하는 쉬운 방법이 있습니까? 파일 이름이나 다른 속성에 의존하지 않습니까?


파일을 생성 한 프로세스에 각 파일을 이전 파일과 관련시키는 특성이 있습니까? 그렇다면 무작위로 선택하는 것보다 대표 표본을 얻는 것이 중요합니다. 프로세스가 본질적으로 무작위 인 파일을 생성 한 경우, 처음 1000 이후의 모든 것을 삭제할 수 있습니다.
fixer1234

답변:


15

디렉토리에서 1000 개의 무작위 파일을 제외한 모든 파일 삭제

암호:

find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm

설명:

  1. 모든 파일 /path/to/dirfind;
    • print0: 라인 구분 기호로 \0( null 문자 )를 사용하십시오. 공백 / 줄 바꿈이 포함 된 파일 경로는 스크립트를 손상시키지 않습니다.
  2. sort;로 파일 목록을 섞습니다 .
    • -z: \0( \n줄 바꾸기) 대신 (널 문자)를 구분 기호로 사용하십시오.
    • -R: 무작위 순서
  3. 무작위 목록에서 처음 1000 줄을 tail;
    • -z: 목록을 0으로 구분하여 처리합니다 (와 동일 sort)
    • -n +1001: 1001에서 시작하는 행을 표시합니다 (즉, 첫 1000 행을 생략).
  4. xargs -0 rm -나머지 파일을 제거하십시오.
    • -0: 다시 0으로 구분

quixotic의 솔루션 보다 나은 이유 * :

  1. 공백 / 줄 바꾸기가 포함 된 파일 이름과 함께 작동합니다.
  2. 디렉토리를 만들려고하지 않습니다 (이미 존재하는 btw).
  3. 파일을 옮기지 않고 파일 목록 외에 1000 개의 "럭키 파일"을 건드리지 않아도됩니다 find.
  4. 어떤 이유로 출력이 (줄 바꿈)으로 find끝나지 않는 경우 파일 누락을 방지합니다 \n.

* -에 신용 돈키호테 를위한 | sort -R | head -1000, 나에게 시작 지점을했다.


CentOS 6에서 실행 중 잘못된 피연산자에 대한 오류가 발생했습니다. 다행히 나는 그 날 위해 일했습니다 피연산자 제거 있도록 filepaths에 공백 우려하고 있지 않다find . -type f | sort -R | tail -n +1001 | xargs rm
브래드를

@brad 오류 메시지와 버전을 제공 할 수 find있습니까? 나는 대답을 개선하려고 노력할 것입니다.
rld.

3
tail: invalid option -- 'z'내가 가진 꼬리의 버전은 8.4
brad

파일이 없으면 오류를 피하기 위해 xargs에 --no-run-if-empty를 추가합니다 (예 : 파일을 두 번 실행 한 후)
fraff

1

임시 디렉토리를 사용한 다음 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,과 -0xargs적절한 파일 이름 처리를 보장하기 위해.

마지막으로 tmp-dir이미 존재하는 경우 존재하지 않는 디렉토리 이름을 대체해야합니다.


나열된 파일 이름 중 하나라도 find공백 을 포함 하면 실패합니다 .
rld.

0

Mac 사용자의 경우 다음 스크립트가 수행해야합니다.

find . -type f -print0 | tr '\0' '\n' | sort -R | tail -n +10000 | tr '\n' '\0' | xargs -0 rm

tr정렬 및 꼬리가 \n대신 목록에서 작동하도록 허용 \0합니다.


-2

가장 쉬운 방법은 디렉토리를 rm -rf 한 다음 너무 오래 실행되지 않도록 데이터 생성 스크립트를 다시 실행하는 것입니다.


그것은 OP가 요구 한 것이 아닙니다. 아마도 그렇게하는 것이 가능하지 않을 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.