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