3개월 미만의 Linux tar 파일(파일 이름에 날짜 사용)

3개월 미만의 Linux tar 파일(파일 이름에 날짜 사용)

Linux에는 파일 이름이 YYYYMMDD 날짜로 시작하는 파일이 있습니다.

20160201_001.pdf
20160110_002.pdf
20150201_003.pdf
20140201_004.pdf

다음 날짜 범위보다 작은 파일을 압축하고 싶습니다(mtime을 사용하지 않고 파일 이름 기간을 사용함).

date +'%Y%m' -d '4 months ago'  (201511)

기본적으로 하고 싶은 일

files=($(find . -name filename< date +'%Y%m' -d '4 months ago'))
tar cvfz backup.tar.gz "${files[@]}"

파일 압축의 예상 결과:

20150201_003.pdf
20140201_004.pdf

어떻게 해야 하나요?

답변1

해당 날짜 형식을 사용하면 에서 문자열 정렬을 사용할 수 있습니다 awk. 예를 들면 다음과 같습니다.

files=( $(ls | awk -v d=$(date -d '4 months ago' +%Y%m%d_999.pdf) '$1<d {print;}') )
tar cvfz backup.tar.gz "${files[@]}"

프로그램 awk은 입력 줄을 읽고 규칙을 적용합니다. 이 경우 d클립 날짜가 파일 이름으로 확장되므로 변수 세트를 먼저 호출합니다. 그런 다음 각 줄에 대해 첫 번째 단어( $1)를 클립 날짜( d)와 알파벳순으로 비교하고 입력이 클립 앞에 오면 해당 줄을 인쇄합니다(그렇지 않으면 인쇄되지 않음).

월별로 클립하려면 4개월 전의 달을 제외하거나 4개월 전의 달을 포함하도록 %d변경 하세요.0099

답변2

귀하의 요구 사항에 따라 이 스크립트를 확인하십시오. 이것이 당신에게 유용하길 바랍니다. 귀하의 요구 사항에 따라 변경하십시오

lines=`expr 0 + 0`
maxlines=`expr 0 + 100`
while [ 1 -le 5 ] ; do
     d=`date +%G%m%d`
     count=`ls -1 | grep $d |wc -l`
     c=`expr $count + 0`
     while [ $c -gt 0 ]; do
          file=`ls -1 | grep $d |tail -$c |head -1`
          searchFile=`grep $file tmp | head -1 | wc -l`
          searchFile=`expr $searchFile + 0`
          if [  $searchFile -eq 0 ]; then
               cp $file /home/avinash/f
               echo $file >>tmp
               lines=`expr $lines + 1`
          fi 
          c=`expr $c - 1`
     done     
     if [ $lines -gt $maxlines ]; then 
            k=`date +%G%m`
          grep $k tmp > t
          mv -f t tmp
          lines=`expr 0 + 0`
     fi     
done

이 스크립트는 서버 시간을 기준으로 오늘의 파일만 선택합니다. 스크립트가 무한 루프로 실행 중입니다.

따라서 디렉터리에 새 파일이 있을 때마다 파일 이름을 확인하고 이름에 오늘 날짜가 포함되어 있으면 home/avinash/redPI Server가 읽을 파일을 가져오는 디렉터리에 파일을 넣습니다.

폴더 이름은 편한대로 변경해주세요. 이제 한 단어나 기호만 포함하는 /home/avinash폴더에 이 파일이라는 파일을 보관해야 합니다 . temp의 목적은 스크립트가 PI 폴더로 전송한 모든 파일 이름을 수집하는 것입니다. 따라서 스크립트가 다음 과 같은 파일을 전송하면 해당 내용이 포함됩니다 .temphiABC_20110725.txtDEF_20110725.txttmp

답변3

한 가지 방법은 다음과 같습니다.

$ files=( $(d=$(date +'%Y%m' -d '4 months ago'); 
          for f in *.pdf; do [[ "${f:0:6}" -le "$d" ]] && 
                             printf '%s\n' "$f"; done;) )
$ tar cvzf backup.tgz "${files[@]}"
20140201_004.pdf
20150201_003.pdf

설명하다

  • d=$(date +'%Y%m' -d '4 months ago'): 변수를 $d원하는 날짜로 설정합니다.
  • for f in *.pdf; do ... ; done.pdf: 디렉터리의 모든 파일을 반복하여 각 파일을 $f.
  • [[ "${f:0:6}" -le "$d" ]]: 파일명의 처음 6자가 해당 값보다 작거나 같은지 확인합니다 $d.
  • && printf '%s\n' "$f"; done;: 그렇다면 파일 이름을 인쇄하십시오.
  • files=( $( ... ) ): 위의 출력을 배열에 저장합니다 $files.

이는 모든 pdf파일 이름이 최소 6자리 숫자로 시작한다고 가정하고, 그렇지 않으면 오류가 발생한다는 점에 유의하세요. 다음을 수행하는 PDF 파일만 반복하여 더욱 강력하게 만들 수 있습니다.

for f in [0-9][0-9][0-9][0-9][0-9][0-9]*.pdf; do ...

관련 정보