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は読み取るファイルをインポートするディレクトリにファイルを配置します。
フォルダ名は気軽に変更してください。これで、1つの単語または記号のみを含む/home/avinash
フォルダにこのファイルと呼ばれるファイルを保存する必要があります。 tempの目的は、スクリプトがPIフォルダに送信したすべてのファイル名を収集することです。したがって、スクリプトが次のファイルを転送すると、その内容が含まれます。temp
hi
ABC_20110725.txt
DEF_20110725.txt
tmp
答え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 ...