
ディレクトリには次のzipファイルがあります。
DBSOURCE20150601.gz
WINDOWS20150504.gz
NETWORK20150609.gz
PATCHTEST20150512.gz
.................
................
ファイル名に記載されている日付に基づいて10日を過ぎたzipファイルを削除したいと思います。例えば、
WINDOWS20150604.gz is file having date 4 June 2015.
私は次のことをしようとしていますが、なぜ10日後のファイルだけを削除するのではなく、すべてのzipファイルを削除するのかわかりません。
ten_days=$(date -d "10 days ago" +%Y%m%d)
for f in *[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].gz; do
date=${f#*}
date=${date%.gz}
(( $date < $ten_days )) && rm "$f"
done
答え1
ファイル名から日付が正しく抽出されませんでした。これを行うには、次の操作を行う必要があります。
date=${f#*}
date=${date%.gz}
date=`echo $date| rev `
date=${date:0:8}
date=`echo $date| rev `
これで日付を比較して削除できます。
答え2
最初の行にしたいと思います。たとえば、date=${f#*}
コマンドを介して参照しているため、変数からコマンドが削除されます。この例のようにループに別々に渡されないため、inを使用して変数から最初の部分を削除することはできません。DBSOURCE
f
*[0-9]...[0-9].gz
*
date=${f#*}
*
for
DBSOURCE
ファイル名構造が常に同じであれば、簡単に使用できます
date=${f//[^0-9]/}
数字以外の文字をすべて削除します。 (実際には数字以外のすべての文字を「なし」に置き換えます。)
tr
別の方法は抽出日を使用することです。
date=`echo $f|tr -d '[:alpha:] [:punct:]'`