최신 파일을 제외한 파일을 번호순으로 삭제

최신 파일을 제외한 파일을 번호순으로 삭제

Bash 스크립트에서 파일을 삭제하려고 합니다.

최신 파일을 나열할 수 있습니다.

ls | grep core | tail -n 1

이름을 로 바꾸고 keep-core-2994-xyz.bin나머지는 삭제합니다.

rm -f core-*

그런 다음 최신 이름을 원본 이름으로 바꿉니다. 이렇게 하면 최신 파일을 유지하고 나머지 파일을 삭제할 수 있습니다. 이는 다음 상황에 적합합니다.

-rw-------  1 root root  47M Sep  3  2017 core-2994-xyz.bin
-rw-------  1 root root  47M Sep  3  2017 core-3012-xyz.bin
-rw-------  1 root root  79M Sep  3  2017 core-3106-xyz.bin

그러나 이것은 core-10000-xyz.bin문제를 일으켰습니다.

-rw-r--r--  1 root root  55M Sep  3  2017 core-10000-xyz.bin
-rw-------  1 root root  47M Sep  3  2017 core-3012-xyz.bin
-rw-------  1 root root  79M Sep  3  2017 core-3106-xyz.bin

head…이번에는 함께가 아닌 내가 원하는 사람과 함께해야 하기 때문이다 tail

이 명령으로 생성된 최신 파일 이외의 파일을 삭제하는 효율적인 방법이 있습니까? (여기, core-3012-xyz.bin)

파일 타임스탬프는 신뢰할 수 없습니다. 이것은 내장된 장치이고 인터넷 연결에 따라 타임스탬프가 변경될 수 있으므로 타임스탬프별로 나열할 수 없습니다.

이것은 임베디드 장치이고 zsh로 컴파일하고 싶지 않습니다. bash 전용 솔루션을 원합니다.

답변1

그리고 zsh:

rm -f -- *core*(n[1,-2])

여기서 glob 한정자는 n켜지고 해당 glob 확장에 대해 첫 번째부터 마지막까지 두 번째를 선택합니다.numericglobsort[1,-2]

또는:

rm -f core-<1-4294967295>-xyz.bin(n.[1,-2])

더 구체적으로 만들고 싶다면 <1-2147483647>유효한 PID 번호 범위 내의 숫자를 나타내는 숫자 시퀀스를 일치시키고 한정자는 .확장을 다음으로 제한합니다.정기적인파일만.

core-bar-123정리되오니 참고해주세요앞으로 core-bar-1000그리고 이전에도 core-foo-1. 숫자 정렬은 숫자를 비교하기 전의 부품이 동일한 경우에 사용됩니다. 여기에서 core-bar먼저 정렬하세요 core-foo. 둘 중 하나에 숫자를 추가해도 변경되지 않습니다.

정렬 시 숫자만 고려하려면 다음을 수행하세요.

extract_numbers() {
  set -o localoptions -o extendedglob
  REPLY=${${${REPLY//[^0-9]##/-}#-}%-}
}
rm -f --  *<->*(.no+extract_numbers[1,-2])

where는 which 로 extract_numbers변환되어 숫자 정렬 에 사용됩니다 .some123file5123with3numbers123-5123-3n

답변2

아, 해결책을 찾았습니다.

ls -v | grep core | tail -n 1

작동합니다.

인용하다:

숫자순으로 정렬된 파일 나열

관련 정보