!["디렉토리에 x보다 많은 파일이 있는 경우 가장 오래된 파일 삭제" 쉘 스크립트가 작동하지 않는 이유는 무엇입니까? [복사]](https://linux55.com/image/163515/%22%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%20x%EB%B3%B4%EB%8B%A4%20%EB%A7%8E%EC%9D%80%20%ED%8C%8C%EC%9D%BC%EC%9D%B4%20%EC%9E%88%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%EA%B0%80%EC%9E%A5%20%EC%98%A4%EB%9E%98%EB%90%9C%20%ED%8C%8C%EC%9D%BC%20%EC%82%AD%EC%A0%9C%22%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
제목이 너무 끔찍해서 정말 죄송합니다. 제목이 제가 설명할 수 있는 가장 좋은 단어입니다.
따라서 일부 서버 데이터의 백업 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
tail
15줄 미만이면 출력이 비어 있기 때문입니다. -d '\n'
기본적으로 인용될 수 있는 공백으로 구분된 단어 대신 전체 줄을 읽도록 xargs에 지시하고 -r
인수 없이 명령을 실행하지 않도록 지시합니다. 표준 기능도 아닙니다.