tar -T file list for too many files

1. generate files list

# cd /data/shell/log
# ls *.log
shell1_20191219_131059.log
shell2_20191218_111000.log

# ls *JOB*.log > /store/jobs.lst

さらに多量のファイルの場合、(Too many open files対策)
# find /data/shell/log /data2/shell/log -type f > /store/jobs.lst

日付で絞る(以降)場合、
# find /data/shell/log /data2/shell/log -type f   -newermt "20191231" > /store/jobs.lst

日付で絞る(2日以上古い)場合、
# find /data/shell/log /data2/shell/log -type f   -mtime +1 > /store/jobs.lst

フォルダだけに絞る(subdirを取得しない)場合、
# find /data/shell/log /data2/shell/log -type f  -maxdepth 1 -newermt "20191231" > /store/jobs.lst

/data/shell/log/tmp*.logのようにワイルドカードで絞りたい場合、
# find /data/shell/log/tmp*.log -type f  -maxdepth 1 -newermt "20191231" > /store/jobs.lst
※該当するファイルが多量でない場合には正常に動作するが、多量に存在する場合にはToo many open filesのエラーが発生してしまう。

これを回避するには、以下の方法がある。
# find /data/shell/log -type f  maxdepth 1 -mtime +1 | grep -e "/data/shell/log/tmp.*\.log"
※ grepの場合は正規表現なので、'*' -> '.*'   '.' -> '\.' に変更する。

以下のコードはgrep用の正規表現を作成するコマンドである。
(ダブルクォートで*付きの文字列を囲まないと実際に多量のファイルが存在する環境で実行すると*が複数のファイル名に展開されてしまい想定していない結果となる)
str=$(echo \"/data/shell/log/tmp*.log\" | sed -e 's/\./\\\./g' | sed -e 's/*/.*/g')

2. create a tar with files list

# tar -czvf log_20191219.tar.gz -T /store/jobs.lst

3. extract a tar

# tar -xzvf log_20191219.tar.gz

4. show lists of a tar

# tar -tzvf log_20191219.tar.gz

コメント

人気の投稿