파일 이름에 지정된 날짜를 기준으로 파일 삭제

파일 이름에 지정된 날짜를 기준으로 파일 삭제

디렉토리에는 다음과 같은 zip 파일이 있습니다.

DBSOURCE20150601.gz
WINDOWS20150504.gz
NETWORK20150609.gz
PATCHTEST20150512.gz
.................
................

파일명에 기재된 날짜를 기준으로 10일이 지난 zip 파일을 삭제하고 싶습니다. 예를 들어,

WINDOWS20150604.gz is file having date 4 June 2015.

다음을 수행하려고 하는데 왜 10일이 지난 파일만 삭제하는 대신 모든 zip 파일을 삭제하는지 잘 모르겠습니다.

ten_days=$(date -d "10 days ago" +%Y%m%d)
for f in *[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].gz; do
  date=${f#*}
  date=${date%.gz}
  (( $date < $ten_days )) && rm "$f"
done

답변1

파일 이름에서 날짜가 올바르게 추출되지 않았습니다. 이렇게 하려면 다음을 수행해야 합니다.

    date=${f#*}
    date=${date%.gz}
    date=`echo $date| rev `
    date=${date:0:8}
    date=`echo $date| rev `

이제 날짜를 비교하고 삭제할 수 있습니다.

답변2

첫 번째 줄에 원한다고 생각합니다. 예를 들어 date=${f#*}명령을 통해 참조하고 있으므로 변수에서 명령이 제거됩니다. 이 예제와 같이 루프에 별도로 전달되지 않기 때문에 in을 사용하여 변수에서 첫 번째 부분을 제거할 수 없습니다.DBSOURCEf*[0-9]...[0-9].gz*date=${f#*}*forDBSOURCE

파일 이름 구조가 항상 동일하면 간단히 사용할 수 있습니다

date=${f//[^0-9]/}

숫자가 아닌 문자를 모두 제거합니다. (실제로 숫자가 아닌 모든 문자를 "없음"으로 바꿉니다.)

tr또 다른 방법은 추출 날짜를 사용하는 것입니다 .

date=`echo $f|tr -d '[:alpha:] [:punct:]'`

관련 정보