4개월(이전 3개월 + 현재 1개월) 이후의 파일을 디렉터리에 저장하고 나머지는 tar로 저장해야 합니다. 그런데 문제는 내 파일이 다른 형식으로 구성되어 있다는 것입니다.
StockList_03-01-2015.txt
Ref_01-02-2016.txt
Data_2015-07-20.txt
Test_2016-01-13.txt
위의 예와 같이 날짜는 다음과 같습니다.년 월 일또는년 월 일형식을 사용하려면 파일 이름에서 날짜를 추출하고 (이전 3개월 + 이번 달 1월) 범위에 있지 않은지 비교한 다음 압축해야 합니다.
오늘은 3월 2일이며, 2015년 12월 1일부터 오늘까지의 파일은 유지되지만 다른 파일은 타르 처리됩니다.
예에서 예상되는 tar 파일은 다음과 같습니다.
StockList_03-01-2015.txt
Data_2015-07-20.txt
두 가지 유형의 날짜 형식 모두에 대해 정규식을 작성할 수 있지만 이를 결합하는 방법을 모르겠습니다.
yyyy-mm-dd에 대한 정규식:
ls |grep -Eo '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}'
dd-mm-yyyy에 대한 정규식:
ls |grep -Eo '[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{4}'
날짜 비교:
files=($(ls | awk -v d=$(date -d '3 months ago' +%m-%Y.log) 'DATE_FROM_FILES< d {print;}' ))
tar cvzf archive.tar.gz "${files[@]}"
답변1
날짜가 확장자 앞의 마지막 부분이고 뒤에 밑줄이 오고 확장자가 항상 .txt인 특정 일반 파일 이름 형식을 가정하면 다음과 같은 스크립트를 사용할 수 있습니다.
d=$(date -d '3 months ago' +%Y-%m)
files=()
ls | while read f ; do
df1="${${f##*_}%.txt}"
df2=${df1//-//}
df=$( date --date $df1 +%Y-%m 2>/dev/null || date --date $df2 +%Y-%m)
[[ "$df" < "$d" ]] && files=( $files $f )
done
tar cvzf archive.tar.gz "${files[@]}"
# rm ${files[@]}
여기서 중요한 점은 비교되는 날짜 문자열의 연도 값이 월 값 왼쪽에 있어야 알파벳 순서가 날짜 순서로 이해된다는 것입니다. 다음으로, 명령은 먼저 파일 이름의 마지막 밑줄까지 모든 것을 제거한 다음 확장자를 제거하여 파일 이름에서 얻은 date
날짜를 yyyy-mm-dd
또는 dd/mm/yyyy
; 로 사용할 수 있습니다. 그것은 대체에 의해 획득 됩니다.$df1
.txt
$df2
-
/
이런 방식으로 $df1
및 중 하나가 $df2
파일 이름의 날짜 부분을 결정하고 이를 yyyy-mm
비교 형식으로 수정할 수 있어야 합니다. 이는 date
날짜 오류 메시지와 함께 실패하고 dd-mm-yyyy
스크립트는 이를 다음으로 파이프합니다./dev/null
그런 다음 잘라낸 날짜 이전의 파일 이름을 정렬하고 압축한 다음 압축된 파일을 삭제(주석 처리)하면 됩니다.