![3개월 미만의 Linux tar 파일(파일 이름에 날짜 사용)](https://linux55.com/image/84491/3%EA%B0%9C%EC%9B%94%20%EB%AF%B8%EB%A7%8C%EC%9D%98%20Linux%20tar%20%ED%8C%8C%EC%9D%BC(%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%97%90%20%EB%82%A0%EC%A7%9C%20%EC%82%AC%EC%9A%A9).png)
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
변경 하세요.00
99
답변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/red
PI Server가 읽을 파일을 가져오는 디렉터리에 파일을 넣습니다.
폴더 이름은 편한대로 변경해주세요. 이제 한 단어나 기호만 포함하는 /home/avinash
폴더에 이 파일이라는 파일을 보관해야 합니다 . temp의 목적은 스크립트가 PI 폴더로 전송한 모든 파일 이름을 수집하는 것입니다. 따라서 스크립트가 다음 과 같은 파일을 전송하면 해당 내용이 포함됩니다 .temp
hi
ABC_20110725.txt
DEF_20110725.txt
tmp
답변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 ...