하위 디렉터리의 마지막 파일을 제외한 모든 파일을 삭제하려면 찾기를 사용하세요.

하위 디렉터리의 마지막 파일을 제외한 모든 파일을 삭제하려면 찾기를 사용하세요.

여러 하위 디렉터리에 있는 중복 파일을 삭제하여 공간을 확보하고 싶습니다. 그런데 저는 항상 파일트렁크의 마지막 파일을 보관하고 싶어요. 예를 들어 다음과 유사한 분류가 있습니다(건드리지 말아야 할 다른 파일 옆에).

FILE_1-1 FILE_1-2 FILE_1-3 FILE_2-1 FILE_2-2

여러 가지 하위 디렉터리에 있습니다. FILE_2-2이 경우에는 보관하고 싶지만 다른 폴더에는 보관될 FILE_3-1것입니다. 항상 마지막 파일입니다. 나는 하위 디렉토리를 잘 반복하기 위해 find 명령을 사용하여 그것들을 모두 제거하는 방법을 알고 있습니다.

find . -name "FILE_*" -type f -delete

FILE_*find 명령을 사용하여 각 디렉토리의 마지막 삭제를 제외하려면 어떻게 해야 합니까?구글 검색(https://www.unix.com/shell-programming-and-scripting/36639-find-remove-all-but-latest-file.html) 다음과 같은 결론을 얻었다.

ls -1 FILE_* | sort -r | tail +2 | xargs -i rm {}

하지만 이 명령은 분기 디렉터리에서는 작동하지 않습니다. 그렇죠?

답변1

디렉토리에서 "줄기"를 찾을 수 있습니다:

ls * | sed -r 's/[0-9]+$//' | sort | uniq

각 줄기에 대해 마지막 단어에 대한 모든 파일을 나열할 수 있습니다.

ls  FILE_1-* | head -n -1

또는 최신 상태를 유지하려는 경우:

ls -rt FILE_1-* | head -n -1

이 두 명령 모두 나중에 | xargs rm출력을 삭제할 수 있습니다.

모든 것을 짧은 스크립트(*)에 넣고 다음을 실행합니다.

find . -type d -exec {the_script} {} \;

(*) 짧은 스크립트는 다음과 같습니다:

#! /bin/bash
cd "$1"  # takes the directory as a parameter
for stem in $(ls FILE* | sed -r 's/[0-9]+$//' | sort | uniq)
do 
    ls -rt ${stem}* | head -n -1 | xargs echo rm 
done

물론 철저하게 테스트하고 올바른 파일이 삭제될 것이라는 확신이 들면 교체하십시오 echo rm.rm

관련 정보