#!/bin/sh
LANG=C;export LANG
KEEP_DAYS=10
#移動元
acclogdir=/export/home/justadmi/test/acclog
consoledir=/export/home/justadmi/test/consolelog
sardir=/export/home/justadmi/test/sarlog
#移動先
target_accelogdir=/export/home/justadmi/test/mv_acdir
target_consoleldir=/export/home/justadmi/test/mv_consdi
target_sardir=/export/home/justadmi/test/mv_sadir
#ファイル移動の条件
LIST="
$acclogdir,access.200,$target_accelogdir
$consoledir,jusmgdp02_console.log.200,$target_consoleldir
$sardir,sa200,$target_sardir
"
for i in $LIST
do
DIR=`echo "${i}"|cut -d ',' -f1`
FILE=`echo "${i}"|cut -d ',' -f2`
TARGETDIR=`echo "${i}"|cut -d ',' -f3`
cd $DIR
mv `find . -name $FILE\* -type f -mtime +$KEEP_DAYS -print` $TARGETDIR
done
exit 0
移動元(3ディレクトリを対象)には、複数のファイルが存在し、エラーハンドリングとして、対象のファイルが無い場合は、なにもせず終了としたく
どのように記述をしたらよいでしょうか。宜しくお願いいたします。
cd した先に条件に合うファイルが存在するかどうかあらかじめ検査した上で mv を実行すればいいわけですよね。
確か組み込み関数のtest あるいは [...] を使えば検査できたはずだけど、回答にするほどには自信を持った答えはマニュアルを今は参照できないのでかけません。
おおざっはに書くと、
TARGETDIR=`echo "${i}"|cut -d ',' -f3`
cd $DIR
mv `find . -name $FILE\* -type f -mtime +$KEEP_DAYS -print` $TARGETDIR
done
これを↓のような感じに変更すればいいはず。
TARGETDIR=`echo "${i}"|cut -d ',' -f3`
cd $DIR
if [`find . -name $FILE\* -type f -mtime +$KEEP_DAYS -print`] then
mv `find . -name $FILE\* -type f -mtime +$KEEP_DAYS -print` $TARGETDIR
else
exit 0
endif
done
組み込みtest関数の使い方を思い出せないので、正しいoptionの使い方を確認して、もう少し修正してから試してみてください。
find を以下のように修正してください。
#mv `find . -name $FILE\* -type f -mtime +$KEEP_DAYS -print` $TARGETDIR find . -name $FILE\* -type f -mtime +$KEEP_DAYS -exec mv {} $TARGETDIR \;
xargs を使っていないのは gnu の mv でないとうまく動かないから。
テスト環境は FreeBSD で traditional なコマンドオプションのみ使っています。
コメント(1件)
考え方は合ってると思うけど、B-Shellの構文的に合っているかどうかは自信がない(というより多分間違っている)ので、参考程度でよければ、回答をオープンし、そうでないなら放置してください。