Bシェルでのファイルの移動方法の記述について


あるディレクトリにあるファイルがn日(10日)経過したファイルを指定の
ディレクトリへ移動させるシェルスクリプトを作成したいと思っています。

以下削除スクリプトがあるとします。
これを、移動用に修正したいと考えています。

LANG=C;export LANG
KEEP_DAY=10

acclogdir=/export/home/user/logs
consoledir=/export/home/user/console/logs
sardir=/export/home/scripts/data

LIST="
$acclogdir,access.200
$consoledir,consolelog.200
$sardir,sar200

for i in $LIST
do
DIR=`echo "${i}|cut -d',' -f1`
FILE=`echo "${i]|cut -d',' -f2`

cd $DIR
find . -name $FILE\* -type -mtime + $KEEP_DAYS -print |xargs rm -f

done

exit 0  

なお、acclogdir →target_acclogdir
   consoledir→target_consoledir
   sardir→target_sardir 

へ移動させたい場合、上記スクリプトをどのように修正すると実現可能でしょうか。
ご教授のほどよろしくお願いします。

回答の条件
  • 1人10回まで
  • 登録:2008/10/26 22:51:16
  • 終了:2008/11/02 22:55:02

回答(3件)

id:kelly1414213 No.1

M.Mouri回答回数13ベストアンサー獲得回数22008/10/26 23:41:50

ポイント27pt

http://openlab.dino.co.jp/2008/02/20/133431188.html

によれば、

find . -name $FILE\* -type -mtime + $KEEP_DAYS -print |xargs rm -f

find . -name $FILE\* -type -mtime + $KEEP_DAYS -print |xargs mv -t target_$DIR

に変更すればうまくいきそうです。target_acclogdir, target_consoledir, target_sardirをあらかじめ作っておかないと怒られますが。あと、試してないので自己責任でお願いします。

id:zzz_1980 No.2

zzz_1980回答回数492ベストアンサー獲得回数642008/10/26 23:46:12

ポイント27pt
#!/bin/sh
LANG=C;export LANG
KEEP_DAYS=10
acclogdir=/export/home/user/logs
consoledir=/export/home/user/console/logs
sardir=/export/home/scripts/data
#
target_accelogdir=/tmp
target_consoleldir=/tmp
target_sardir=/tmp
#
LIST="
$acclogdir,access.200,$target_accelogdir
$consoledir,consolelog.200,$target_consoleldir
$sardir,sar.200,$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
id:otanako

zzz_1980 さん

ありがとうございます。

今すぐに試せる環境がないため、明日確認して結果をお知らせいたします。

2008/10/28 00:19:04
id:kelly1414213 No.3

M.Mouri回答回数13ベストアンサー獲得回数22008/10/26 23:52:28

ポイント26pt

上記間違ってました。使わないでください。dirnameとbasenameを使わないといけません。

えーと、

find . -name $FILE\* -type -mtime + $KEEP_DAYS -print |xargs mv -t `dirname $DIR`/target_`basename $DIR`

でしょうか。

id:otanako

kelly1414213 さん

修正内容ありがとうございました。

今すぐに確認できる環境がないため、明日確認したのち、結果お知らせいたします。

2008/10/28 00:19:06
  • id:otanako
    zzz_1980 さん

    取り急ぎ、試した結果ですが
    ファイルの移動はできるようなのですが、
    シェル実行後、以下が出力されます。

    mv: Insufficient arguments (1)
    Usage: mv [-f] [i] f1 f2
    mv [-f] [i] f1 ... fn d1
    mv [-f] [i] d1 d2


    どのように修正したらよいでしょうか。
  • id:otanako
    具体的に以下のように記述したのですが、やはり引数エラーがでてしまいます。
    ファイルの作成日は10/29なので、移動はされないのが正しい動きなのですが
    どこがいけないのでしょうか。

    "mvlog.sh" 27 行、695 バイト
    $ more mvlog.sh

    #!/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_consdir
    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
    $
    $
    $ pwd
    /export/home/justadmi/test
    $ ls
    acclog consolelog mv_acdir mv_consdir mv_sadir mvlog.sh
    sarlog
    $ cd acclog
    $ ls -l
    合計 0
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:26
    access.200801020000
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:26
    access.200801025000
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:26
    access.200801029000
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:26
    access.200809200000
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:26
    access.200809210000
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:26
    access.200809220000
    $
    $ cd ..
    $ cd consolelog
    $ ls -l
    合計 0
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28
    jusmgdp02_console.log.20081010
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28
    jusmgdp02_console.log.20081011
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28
    jusmgdp02_console.log.20081015
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28
    jusmgdp02_console.log.20081020
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28
    jusmgdp02_console.log.20081025
    $
    $ cd ..
    $ cd sarlog
    $ pwd
    /export/home/justadmi/test/sarlog
    $ ls -l
    合計 0
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28 sa20081010
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28 sa20081011
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28 sa20081012
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28 sa20081021
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28 sa20081028
    -rw-r--r-- 1 justadmi jus 0 10月 29日 18:28 sa20081029
    $
    $ cd ..
    $ pwd
    /export/home/justadmi/test
    $
    $ mvlog.sh
    mv: Insufficient arguments (1)
    Usage: mv [-f] [-i] f1 f2
    mv [-f] [-i] f1 ... fn d1
    mv [-f] [-i] d1 d2
    mv: Insufficient arguments (1)
    Usage: mv [-f] [-i] f1 f2
    mv [-f] [-i] f1 ... fn d1
    mv [-f] [-i] d1 d2
    mv: Insufficient arguments (1)
    Usage: mv [-f] [-i] f1 f2
    mv [-f] [-i] f1 ... fn d1
    mv [-f] [-i] d1 d2
    $
  • id:zzz_1980
    ああ、ごめんなさい、私のはlog 以下に複数のファイルがあるとダメですね。
    find から mv を直接叩かないと。
  • id:otanako
    zzz_1980さん
    複数ファイルがある場合は、findからmvを直接たたかないとNGとのことですが
    どのような記述になりますでしょうか?
    (初歩的で申し訳ありません)
  • id:zzz_1980
    間違いの間違いでした。
    「複数ファイルがあるとき」ではなくて、
    「移動すべきファイルがひとつも無いとき」エラーになります。
    (そこまで確認していないので)
    KEEP_DAYS=10
    は10日前までなら
    KEEP_DAYS=10d
    としてください。
    デバッグのときは、
    KEEP_DAYS=0s
    とでもしておけば0秒になります。








  • id:otanako
    zzz_1980 さん
    たびたびすみません。

    それでは、移動対象ファイルが存在しない場合に
    エラーを出さない(ない、という結果で終了)
    とするには、どうしたらよいでしょうか。

    KEEP_DAYS=10
    は10日前までなら
    KEEP_DAYS=10d

    としないとNGでしょうか。最初の動作確認では移動できたのですが。。。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません