최신 폴더만 유지하면서 하위 폴더를 찾아 삭제하세요.

최신 폴더만 유지하면서 하위 폴더를 찾아 삭제하세요.

특정 폴더에서 가장 최근에 생성된 하위 폴더를 제외하고 모든 하위 폴더를 삭제하는 자동화된 방법을 설정하려고 합니다.

예를 들어 가장 최근의 하위 폴더 3개만 유지하고 다른 하위 폴더는 모두 삭제하고 싶습니다.

주어진 폴더를 상상해보십시오.

/some/specific/folder
    /subfolder1
    /subfolder2
    /subfolder3
    /subfolder4
    /subfolder5
    /subfolder6
    /subfolder7
    /subfolder8
    /subfolder9
    /subfolder10

하위 폴더를 모두 삭제하고 싶지만 subfolder8, subfolder9subfolder10...

이제 보관하고 싶은 파일 목록을 관리했습니다. 그런데 쉘 명령에서 파일을 어떻게 "반전"합니까?

cd /some/specific/folder/
ls -tr | head -3

# Gives the following result
subfolder8
subfolder9
subfolder10

# And I am looking for the following :
subfolder1
subfolder2
subfolder3
subfolder4
subfolder5
subfolder6
subfolder7

어떤 아이디어가 있나요?

답변1

ls -tr | head -3 보관할 올바른 3개의 폴더가 제공 되면 ls -tr | tail -n +4다른 모든 폴더도 제공됩니다(처음 3줄은 건너뛰기).

답변2

그리고 zsh:

cd /some/specific/folder && echo rm -rf -- *(/n[1,-4])

/숫자( ) 정렬 순서에 따라 n마지막 3개 폴더( )를 제외한 모든 폴더가 삭제됩니다 (여기서subfolder10뒤쪽에 subfolder2), 숨겨진 항목은 제외됩니다.

echo실제로 작업을 수행하려면 삭제하세요 .

많은 시스템에서는 생성 시간이 기록되지 않으며, 기록하더라도(예: 최신 Linux) 쉽게 검색할 수 있는 방법이 없습니다. 믿을 수 있는 것은 마지막으로 수정된 날짜(출력에 표시된 날짜 ls -l)뿐입니다.

가장 최근에 수정된 3개 항목을 제외하고 모두 삭제하려면 다음을 사용하세요 zsh.

cd /some/specific/folder && echo rm -rf -- *(/Om[1,-4])

Om수정 시간을 기준으로 역순으로 정렬합니다(예: 가장 오래된 것부터 최신 것 순 ls -tr).

설치하지 않거나 설치할 수 없지만 zsh최신 GNU 시스템을 사용하는 경우 다음을 수행할 수 있습니다.

(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f\0' |
    sort -rnz |
    tail -zn +4 |
    cut -zf 2- |
    xargs -r0 echo rm -rf --)

최신 GNU 시스템의 경우( -z이러한 유틸리티 중 일부는 최근에 추가되었습니다):

(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f\0' |
    tr '\n\0' '\0\n' |
    sort -rn |
    tail -n +4 |
    cut -f 2- |
    tr '\0\n' '\n\0' |
    xargs -r0 echo rm -rf --)

디렉토리의 파일 이름에 개행, 공백, 따옴표 또는 백슬래시가 포함되어 있지 않은 경우 다음을 수행할 수도 있습니다.

cd /some/specific/folder &&
  ls -pt | grep '/$' | tail -n +4 | xargs echo rm -rf --

zshs 와 같은 숫자 정렬에 대해서는 *(n)GNU ls -v옵션도 참조하세요.

관련 정보