人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

bash でファイル移動するスクリプトの書き方について教えてください。


以下のような、ディレクトリがあります。

#移動元ディレクトリ
logdir=/export/home/user/t_dir ・・・>*.log(20080801.log、20080802.log、20080801_console.log…)複数ファイルがある
sardir=/export/home/user/t_sar_dir ・・・>sar*(sa20080801、sa20080802…)複数ファイルがある
#移動先ディレクトリ
targetdir=/export/home/user/mv_dir

移動元のディレクトリに、指定のファイル(※1)がある場合、targetdir へ
移動させ、両ディレクトリ内(片方・両方)マッチするファイルがなければ、何もせず終了という処理をしたいのですが、
どのように記述したらよいでしょうか。

(※)logdirには、複数の種別のログファイルがあり、mvコマンドでいうところ「mv 200808*_console.log」
にマッチするファイルを移動させたい
sardirも同じ mvコマンドでいう「mv sa200808*」

よろしくおねがいします。

●質問者: otanako
●カテゴリ:コンピュータ 学習・教育
✍キーワード:bash HOME MV USER コマンド
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● Mook
●10ポイント

ほとんどご自身が書いたそのままだと思いますが、問題にされているのは

対象ファイルがない場合にエラーになる点でしょうか。


であれば、下記のような方法で回避できるかと思います。

#!/bin/sh
logdir=/export/home/user/t_dir
sardir=/export/home/user/t_sar_dir
targetdir=/export/home/user/mv_dir

cdir=`pwd`

cd $logdir
for f in 200808*_console.log; do mv $f $targetdir; done

cd $sardir
for f in sa200808*; do mv $f $targetdir; done

cd $cdir

不明な点があったらコメントで対応しますので、有効にお願いします。

http://homepage.mac.com/sdkfz164/terminal/mv.html

http://linux.ascii24.com/linux/allascii/linuxmag/articles/9910/p...

◎質問者からの返答

Mookさん

テストしたのですが、以下エラーが出ました。

テスト:t_dirには対象ファイルがあり、t_sar_dirにはファイルが存在しない状態

「mv: sa200808* を使用できません。」

スクリプトは以下となります。

logdir=/export/home/user/t_dir

sardir=/export/home/user/t_sar_dir

targetdir=/export/home/user/t_mv_dir

cdir=`pwd`

cd $logdir

for f in 200808*_console.log; do mv $f $targetdir; done

cd $sardir

for f in sa200808*; do mv $f $targetdir; done


2 ● b-wind
●40ポイント
#!/bin/sh
logdir=/export/home/user/t_dir
sardir=/export/home/user/t_sar_dir
targetdir=/export/home/user/mv_dir

log_files=`find $logdir -name '200808*_console.log' -print`
sar_files=`find $sardir -name 'sa200808*' -print`

[ -n "$logfiles" ] && mv $logfiles $targetdir

[ -n "$sar_files" ] && mv $sar_files $targetdir

Manpage of TEST

ファイル数が多くなると一つ一つ移動する方法では遅くなりますね。

◎質問者からの返答

b-wind さん

ありがとうございます。

ばっちり実行できました。ファイルが存在しない場合も問題なく終了しました。

なお、以下の命令の解釈を教えていただいてよいでしょうか。

[ -n "$logfiles" ] && mv $logfiles $targetdir

[ -n "$sar_files" ] && mv $sar_files $targetdir


ファイルがない場合をどのように命令していますか?


3 ● Mook
●30ポイント

最初の回答は、対象ファイルがない場合にエラーになる場合を避けると

言いながら避けられていなかったようです。


b-wind さんの回答で十分だと思いますが、下記のようでもできるかと思います。

#!/bin/bash

logdir=/export/home/user/t_dir
sardir=/export/home/user/t_sar_dir
targetdir=/export/home/user/mv_dir

ls $logdir/200808*_console.log &>/dev/null
[ $? == 0 ] && mv $logdir/200808*_console.log $targetdir

ls $sardir/sa200808* &>/dev/null
[ $? == 0 ] && mv $sardir/sa200808* $targetdir

$? には直前のコマンドの実行結果(成功は0)が入りますので、ファイルがない場合は

実行されません。

ご参考まで。

◎質問者からの返答

Mookさん

ありがとうございます。

上記のように実行しましたが、以下のようなエラーとなりました。

(シェル名はmv_log2.sh)

/export/home/user/t_dir/20080801_console.log /export/home/user/t_dir/20080802_console.log

mv_log2.sh: test: unknown operator ==

また、移動していませんでした。

何がいけないのでしょうか。


4 ● Mook
●10ポイント

先にも書きましたが、このような対応はコメントで十分ですので

コメントを有効にしていただけないでしょうか。


ubuntu の bash では上記で動作したのですが、

== オペレータでエラーが出ているようなので、下記のように変更ください。

ls $logdir/200808*_console.log &>/dev/null
[ $? -eq 0 ] && mv $logdir/200808*_console.log $targetdir

ls $sardir/sa200808* &>/dev/null
[ $? -eq 0 ] && mv $sardir/sa200808* $targetdir

http://www.atmarkit.co.jp/flinux/rensai/theory08/theory08b.html

◎質問者からの返答

Mookさん

失礼しました。コメントを有効としました。

なお、上記の記述で、ばっちり移動できました。

あと、b-windさんに質問していた件回答いただき、ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ