"디렉토리에 x보다 많은 파일이 있는 경우 가장 오래된 파일 삭제" 쉘 스크립트가 작동하지 않는 이유는 무엇입니까? [복사]

"디렉토리에 x보다 많은 파일이 있는 경우 가장 오래된 파일 삭제" 쉘 스크립트가 작동하지 않는 이유는 무엇입니까? [복사]

제목이 너무 끔찍해서 정말 죄송합니다. 제목이 제가 설명할 수 있는 가장 좋은 단어입니다.

따라서 일부 서버 데이터의 백업 tar를 생성하여 /server/backups에 저장하는 백업 스크립트가 있지만 지난 주의 백업만 필요하므로 주간 작업으로 실행하고 백업 폴더를 정리하기 위해 이 스크립트를 생성했습니다.

#!/bin/bash
#initializing a with the amount of backup archives and b with the target max
a=find /server/backups/ -type f | wc -l
b=14

#if there are more backup files than target max
#delete the oldest files
if [ $a > $b ]
then
    ls -1t /server/backups/ | tail -n +15 | xargs rm -f
fi  

하지만 작동하지 않습니다. 저는 Linux를 처음 접했고 "디버깅"하는 방법을 모릅니다.

답변1

a=find /server/backups/ -type f | wc -l

그러면 명령이 실행 /server/backups/되고 a환경 변수가 find. 아니면 실제로는 후행 슬래시 때문에 오류가 발생했을 수도 있습니다. 네가 원하는 건 하나야명령 대체.

if [ $a > $b ]

여기는>비교하면 예를 들어 . 2보다 클 것입니다 14. 변수를 인용해야 하지만 숫자만 포함하는 경우에는 문제가 되지 않을 수 있습니다.

ls -1t /server/backups/ | tail -n +15 | xargs rm -f

여기에 공백, 따옴표 또는 개행 문자가 포함된 파일 이름에는 명백한 문제가 있습니다( xargs입력이 기본적으로 해석되는 방식과 tail줄 처리로 인해). 하지만 이를 무시할 수 있다면 파일 이름이 "nice"인 경우그리고GNU xargs가 있으면 실행할 수 있습니다

ls -t /server/backups/ | tail -n +15 | xargs -d '\n' -r rm

tail15줄 미만이면 출력이 비어 있기 때문입니다. -d '\n'기본적으로 인용될 수 있는 공백으로 구분된 단어 대신 전체 줄을 읽도록 xargs에 지시하고 -r인수 없이 명령을 실행하지 않도록 지시합니다. 표준 기능도 아닙니다.

관련 정보