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は読み取るファイルをインポートするディレクトリにファイルを配置します。

フォルダ名は気軽に変更してください。これで、1つの単語または記号のみを含む/home/avinashフォルダにこのファイルと呼ばれるファイルを保存する必要があります。 tempの目的は、スクリプトがPIフォルダに送信したすべてのファイル名を収集することです。したがって、スクリプトが次のファイルを転送すると、その内容が含まれます。temphiABC_20110725.txtDEF_20110725.txttmp

答え3

1つの方法は次のとおりです。

$ 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 ...

関連情報