Linux의 각 하위 디렉터리에 가장 큰 파일을 유지하면서 모든 하위 디렉터리의 모든 파일을 삭제하는 방법은 무엇입니까?

Linux의 각 하위 디렉터리에 가장 큰 파일을 유지하면서 모든 하위 디렉터리의 모든 파일을 삭제하는 방법은 무엇입니까?

이것은 나의 첫 번째 질문입니다. 질문을 허용하고 내 질문을 읽어주셔서 감사합니다!

나는 Ubuntu 22.04 w를 사용하고 있습니다. 그놈 쉘과 bash 쉘. 800개가 넘는 하위 디렉터리가 있는 폴더가 있습니다. 각 하위 디렉터리에는 서로 다른 해상도의 동일한 비디오 버전이 4개에서 최대 8개까지 포함되어 있습니다. 각 비디오/하위 디렉터리에 대해 최상의 해상도만 유지하고 싶습니다.

각 하위 디렉터리에서 가장 큰 파일만 유지하면서 모든 하위 디렉터리의 모든 파일을 반복적으로 삭제하려면 어떻게 해야 합니까?

답변1

죄송합니다. 스크립트를 작성하지는 않겠지만 여기에 사용할 수 있는 알고리즘이 하나 있습니다. (다음은 스크립팅 요소를 사용하지만 정확한 스크립트와는 거리가 멀고 단순히 명령을 연결하려고 하면 재앙이 될 수 있습니다)

이 작업을 수행하기 전에 스크립트를 실행하기 전에 테스트하고 복구할 수 없는 파일을 실수로 삭제할 수 있는 다른 디스크에 전체 디렉터리 구조를 복사하는 것이 좋습니다.

  1. 최상위 디렉토리에서 fldrLst='find ./ -type d'(왼쪽 눈금 표시에 작은따옴표를 사용하고 있습니다)
  2. 최상위 디렉토리에서 $fldrLst다음을 수행하면서 반복합니다.
    • 파일 크기가 내림차순으로 단일 디렉터리 리프에서 파일 목록을 가져옵니다. fileLst='find $fldrList[n] -type f -maxdepth 1 -exec ls -al {} \; | sort k 5 -nr'여기서는 [n]목록 배열의 특정 멤버입니다.
    • 디렉터리 리프의 파일 수 계산:echo $fildLst | wc -l
    • 첫 번째 항목(가장 큰 파일이어야 함) 이후의 각 파일을 제거합니다. 반복하여 $fileLst제거합니다 rm $fileList[n](첫 번째 n항목이 배열의 두 번째 항목임).

이를 통해 작업을 수행하는 올바른 방향으로 나아갈 수 있습니다.


이 답변이 솔루션을 찾는 데 도움이 된다면 답변으로 표시하거나 부분 솔루션으로 찬성 투표해 주세요.

답변2

linux - 가장 큰 파일을 제외한 모든 파일 제거

테스트 버전에서는 ls 파일만 제거됩니다.

find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r ls -l

작업 버전에서는 파일이 제거됩니다.

find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r rm

원본 코드 작성자:카밀 마시오로프스키

관련 정보