0

フォルダー内の一連の pcap ファイルを圧縮するための Linux スクリプトを作成しました。2 日以上前のファイルを zip ファイルに保存します。zip は、zip のファイル名として現在の日時で保存されます。最初と最後の pcap ファイルを zip ファイルのファイル名として使用する方法はありますか。

#!/bin/bash
cd /mnt/md0/capture/DCN
#Limit of your choice
ulimit -s 32000
LIMIT=10
#Get the number of files, that has `*.pcap`
in its name, with last modified time 5 days      ago
NUMBER=$(find /mnt/md0/capture/dcn/ -maxdepth 1 -name "*.pcap" -mtime +5 | wc -l)
if [[ $NUMBER -gt $LIMIT ]]  #if number greater than limit
then
FILES=$(find /mnt/md0/capture/dcn/ -maxdepth 1 -name "*.pcap" -mtime +5)
#find the files
zip -j /mnt/md0/capture/dcn/capture_zip-$(date "+%b_%d_%Y_%H_%M_%S").zip $FILES
#zip them
rm $FILES
#delete the originals
ulimit -s 8192 #reset the limit
fi #end of if.
4

1 に答える 1

1

1 つの方法は、シェル配列を使用することです。

IFS=$'\n' FILES=($(find /mnt/md0/capture/dcn/ -maxdepth 1 -name "*.pcap" -mtime +5))
#find the files and put the paths into an array "FILES"

これにより、パスを持つすべてのファイルがシェル配列「FILES」に配置され、ファイル名の空白が考慮されます。順序findは、それらに与えられた順序になります。

zip ファイル名を作成するには:

FIRSTNAME=${FILES[0]##*/}
LASTNAME=${FILES[${#FILES[@]}-1]##*/}
ZIPPREFIX="${FIRSTNAME%.*}-${LASTNAME%.*}"
#zip base name made from first and last file basenames

ここでFIRSTNAME=${FILES[0]##*/}は、拡張子付きのファイルの名前を生成し、拡張子を${FIRSTNAME%.*}削除します。パスとファイル拡張子を取り除きます。(ファイル拡張子を保持したい場合は、 を使用できます$FIRSTNAME。) 値${#FILES[@]}は、配列内のファイルの数です。したがって、やや乱雑に見える${FILES[${#FILES[@]}-1]}は、配列内の最後のファイル名を表します。最後に、余分な##*/in${FILES[${#FILES[@]}-1]##/*}によってパスが削除され、ファイル名が残ります。最終的にZIPPREFIXは、最初の塩基名、ハイフン ( -)、および最後の塩基名になります。必要に応じて、ハイフン以外の別の文字を使用できます。

zip -j /mnt/md0/capture/dcn/"$ZIPPREFIX"-$(date "+%b_%d_%Y_%H_%M_%S").zip "${FILES[@]}"
#zip them

これにより、ファイルが圧縮されます。${FILES[@]}すべての配列要素を提供することに注意してください。

rm "${FILES[@]}"
#remove all the files
于 2013-11-07T12:03:43.110 に答える