파일 이름 비교 및 ​​tar 파일을 기반으로 한 2가지 날짜 형식

파일 이름 비교 및 ​​tar 파일을 기반으로 한 2가지 날짜 형식

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

그런 다음 잘라낸 날짜 이전의 파일 이름을 정렬하고 압축한 다음 압축된 파일을 삭제(주석 처리)하면 됩니다.

관련 정보