プロが教えるわが家の防犯対策術!

いつもお世話になっております。
今回は、mv処理後圧縮するということです。

set DIR1 = /tmp
set DIR2 = /work
mv $DIR1/ファイル1 $DIR2/ファイル1
compress -f $DIR2/ファイル1

としたいのですが、mvで移動したファイル1を
変数設定して圧縮したいのですがどの様に記述きたら
良いでしょうか?

A 回答 (3件)

補足をふまえて。


こんな感じにしてみては:

(1)緊急退避用ディレクトリをmkdir。ディレクトリ名はタイムスタンプやpidなどを含んだものにして一意性を確保する。mktempを使うと楽。

(2)ls -1rtでファイルの一覧(古い順)を取得。一覧の先頭からチェックして、特定の名前だったりディレクトリだったりした場合は対象外として、適合するのものが見つかったら、それを緊急退避用ディレクトリにmv。

(3)ディスク使用率が閾値以下になるまで(2)を繰り返し。

(4)緊急退避用ディレクトリをtar cvfzでアーカイブ。

(5)緊急退避用ディレクトリをrm -r。

・緊急度が高そうなので、圧縮も後回し。
・別フォルダに退避させて、競合を回避。
・フォルダ単位で一括処理して、ファイルをまとめて処理。
――というところで。

同時に動いてる退避プロセスのほうがこけたりして。

> 実際移動されたファイルは上から3つ目ということしかわかっていませんのでファイル名まではわからないのです。

これって、「ls -tr -1 $SRCDIRS/*」と元のディレクトリ名がくっついてるのが悪さしているってことなら、事前にcd $SRCDIRSして、lsしてみては。ファイル名だけが取得できるようになります。
    • good
    • 0
この回答へのお礼

>これって、「ls -tr -1 $SRCDIRS/*」と元のディレクトリ名がくっついてるのが悪さしているってことなら、事前にcd $SRCDIRSして、lsしてみては。ファイル名だけが取得できるようになります。

まさにその通りでした、問題解決できました。
osamuyさん何度も何度もありがとう御座います。

お礼日時:2005/11/10 14:57

> 退避先にファイルがある場合や更新がかかってしまった場合には不向きなような気がしました。



退避先にファイルが存在する場合の仕様を決める必要があります。上書きで問題なければそのままですし、世代管理が必要であれば、何世代保存するのかとかを決めるのが先決でしょう。

更新についても同様で、どのような更新パターンがあって、その場合はどのように退避ファイルを決定するのか、可能ならプロセス停止して更新が発生しないようにするとかの調整をするのが先決です。

そこらへんが決まっているなら、実装はどうとでもなるかと。

そういう回答が望みじゃなくて、スクリプトの細かい話なら、
・使用率の取得は、「df $dir|awk 'NR==2{sub("%","",$5);print $5}'」のほうがきれいかも。
・使用率の取得に同じコードが2回てくるので、関数化したい。
・上位三つ目がディレクトリだった場合、移動させるのはまずくないか。
・移動させたファイル名は分かっているのだから、移動先で再度lsするのは無駄では。
・compressより圧縮率の高いツール(gzipとか)使った方が良くないか。
――とか。

この回答への補足

回答ありがとう御座います。
今回の処理は、臨時対応の一環で作成しております。
すでに移動圧縮するファイルには世代番号が付いております。退避のシェルは通常動いているのですが稀に処理が追いつかなくなる事を考えての対応です。
ですので、このシェルを流すと通常流れているシェルと圧縮が重なる恐れがあります。
compressについてですが、gzipの方が圧縮率は高いことは承知ですが時間が掛かると言うことで、やめました。
>・移動させたファイル名は分かっているのだから、移動先で再度lsするのは無駄では。
実際移動されたファイルは上から3つ目ということしかわかっていませんのでファイル名まではわからないのです。そこで移動させたファイルをそのまま圧縮しょりしたいのですが無理でしょうか?
度々すいません。

補足日時:2005/11/09 14:21
    • good
    • 0

set DIR1 = /tmp


set DIR2 = /work
set FILE1 = ファイル1
mv $DIR1/$FILE1 $DIR2/$FILE1
compress -f $DIR2/$FILE1

――という事ですか?
質問文のスクリプト(csh?)で圧縮はできてそうなので、
「ファイル1を変数設定して」っていうと、上記みたいな回答しか思いつかないのですが。

この回答への補足

回答ありがとう御座います。
言葉足らずですいません。現在以下のようなシェルを作成したのですが、ファイルを移動したあとその移動したファイルを圧縮したいのです。今は、lsで引っ掛けているのですが、若干問題点があります。
すでに退避先にファイルがある場合や更新がかかってしまった場合には不向きなような気がしました。
この点を踏まえてアドバイスなどお願いします。
#上位3つ目のファイルを移動し、圧縮処理
set NORMAL=0 # 正常終了時ステータス
set ABEND=9 # 異常終了時ステータス
set SHELLNAME = log_mv.sh
set LOGFILE = /opt/oracle/log/mv.log.`date '+%y%m%d%H%M'`
set SID = LE9A
echo $SHELLNAME:t ": start time : `date +%y/%m/%d:%H:%M:%S`" >> $LOGFILE

set CAPACITY = `df -k /arch001 | awk '{if ( $6 == "/arch001" ) print $5}' | sed 's/%//'`
echo "$CAPACITY"
while ($CAPACITY >= 90 )
unalias ls
set SRCDIRS = /arch001/$SID
set DESTDIRS = /arch101/$SID
set FILESINDIRES = (`ls -tr -1 $SRCDIRS/*`)
echo mv $FILESINDIRES[3] $DESTDIRS
mv $FILESINDIRES[3] $DESTDIRS
set ST = $status
if ( $ST == $NORMAL ) then
echo "mv 処理 OK" >> $LOGFILE
set DIRS = (`ls -t -1 $DESTDIRS/*`)
echo compress -f $DIRS[1]
compress -f $DIRS[1]
set ST = $status
if ( $ST == $NORMAL ) then
echo "compress 処理 OK" >> $LOGFILE
else
echo "compress 処理 NG" >> $LOGFILE
exit $ABEND
endif
else
echo "mv 処理 NG" >> $LOGFILE
exit $ABEND
endif
set CAPACITY = `df -k /arch001 | awk '{if ( $6 == "/arch001" ) print $5}' | sed 's/%//'`
end

echo $SHELLNAME:t ": end time : `date +%y/%m/%d:%H:%M:%S`" >> $LOGFILE
exit $NORMAL

補足日時:2005/11/09 12:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!