디렉토리에는 다음과 같은 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을 사용하여 변수에서 첫 번째 부분을 제거할 수 없습니다.DBSOURCE
f
*[0-9]...[0-9].gz
*
date=${f#*}
*
for
DBSOURCE
파일 이름 구조가 항상 동일하면 간단히 사용할 수 있습니다
date=${f//[^0-9]/}
숫자가 아닌 문자를 모두 제거합니다. (실제로 숫자가 아닌 모든 문자를 "없음"으로 바꿉니다.)
tr
또 다른 방법은 추출 날짜를 사용하는 것입니다 .
date=`echo $f|tr -d '[:alpha:] [:punct:]'`