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
변환되어 숫자 정렬 에 사용됩니다 .some123file5123with3numbers
123-5123-3
n