- ベストアンサー
mv処理後の環境変数について
いつもお世話になっております。 今回は、mv処理後圧縮するということです。 set DIR1 = /tmp set DIR2 = /work mv $DIR1/ファイル1 $DIR2/ファイル1 compress -f $DIR2/ファイル1 としたいのですが、mvで移動したファイル1を 変数設定して圧縮したいのですがどの様に記述きたら 良いでしょうか?
- みんなの回答 (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してみては。ファイル名だけが取得できるようになります。
その他の回答 (2)
- osamuy
- ベストアンサー率42% (1231/2878)
> 退避先にファイルがある場合や更新がかかってしまった場合には不向きなような気がしました。 退避先にファイルが存在する場合の仕様を決める必要があります。上書きで問題なければそのままですし、世代管理が必要であれば、何世代保存するのかとかを決めるのが先決でしょう。 更新についても同様で、どのような更新パターンがあって、その場合はどのように退避ファイルを決定するのか、可能ならプロセス停止して更新が発生しないようにするとかの調整をするのが先決です。 そこらへんが決まっているなら、実装はどうとでもなるかと。 そういう回答が望みじゃなくて、スクリプトの細かい話なら、 ・使用率の取得は、「df $dir|awk 'NR==2{sub("%","",$5);print $5}'」のほうがきれいかも。 ・使用率の取得に同じコードが2回てくるので、関数化したい。 ・上位三つ目がディレクトリだった場合、移動させるのはまずくないか。 ・移動させたファイル名は分かっているのだから、移動先で再度lsするのは無駄では。 ・compressより圧縮率の高いツール(gzipとか)使った方が良くないか。 ――とか。
補足
回答ありがとう御座います。 今回の処理は、臨時対応の一環で作成しております。 すでに移動圧縮するファイルには世代番号が付いております。退避のシェルは通常動いているのですが稀に処理が追いつかなくなる事を考えての対応です。 ですので、このシェルを流すと通常流れているシェルと圧縮が重なる恐れがあります。 compressについてですが、gzipの方が圧縮率は高いことは承知ですが時間が掛かると言うことで、やめました。 >・移動させたファイル名は分かっているのだから、移動先で再度lsするのは無駄では。 実際移動されたファイルは上から3つ目ということしかわかっていませんのでファイル名まではわからないのです。そこで移動させたファイルをそのまま圧縮しょりしたいのですが無理でしょうか? 度々すいません。
- osamuy
- ベストアンサー率42% (1231/2878)
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
お礼
>これって、「ls -tr -1 $SRCDIRS/*」と元のディレクトリ名がくっついてるのが悪さしているってことなら、事前にcd $SRCDIRSして、lsしてみては。ファイル名だけが取得できるようになります。 まさにその通りでした、問題解決できました。 osamuyさん何度も何度もありがとう御座います。