• 締切済み

特定の名前のディレクトリーを検索して、それぞれの中身を圧縮して、それぞれ別名で保存したいのですが・

HELLO という名前のディレクトリー(複数)を検索し、 その中身を、それぞれ tar.gz して、別ディレクトリーに保存する、 という一連の流れを sh で実現したいと思っています。 HELLOという名前のディレクトリーは、必ず以下のような形で /root/data/site# の下にあります。 /root/data/site4/bbb/ccc/HELLO /root/data/site9/eee/HELLO /root/data/site20/HELLO それぞれの中身が以下のようになっていた場合、 /root/data/site4/bbb/ccc/HELLO/1.txt /root/data/site4/bbb/ccc/HELLO/2.txt /root/data/site4/bbb/ccc/HELLO/3.txt /root/data/site9/eee/HELLO/4.txt /root/data/site9/eee/HELLO/5.txt /root/data/site9/eee/HELLO/6.txt /root/data/site20/HELLO/7.txt /root/data/site20/HELLO/8.txt それぞれの中身を /home/backup というディレクトリー内に、site# を冠した名前で、 site4.tar.gz site9.tar.gz site20.tar.gz のように保存したいです。 *たとえばsite4.tar.gz は、解凍すると、1.txt 2.txt 3.txt という 3つのファイルが出来るようなtarballです。 find /root/data -name "HELLO" でHELLOディレクトリーを検索するとして、それが複数見つかったうえ、それぞれの中身を、 パスに含まれるsite#を冠したtarballにするあたりの処理が どうしてもうまく記述できません。 site#を冠したtarballにするのが無理なら、単純に、 1.tar.gz  2.tar.gz  3.tar.gz というような 名前でも構いません。 サンプルshをぜひご教授宜しく御願いいたします。

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

一重引用符の中では shell 変数が展開されません。awk に shell 変数を 渡すのは -v で awk の変数にして渡すのが定石のようです。そうすると find /root/data -type d -a -name 'HELLO' | awk -v DAY="$DAY" -F/ '{print "cd " $0 "; tar zcf /home/backup/" DAY "/" $4 ".tar.gz ."}' | sh になります。 ちなみに、上記は、 find で HELLO という名前を持つディレクトリを抽出し、そのデータを awk で処理しています。awk ではディレクトリ名を / で分割(-F/)する と、$0 はディレクトリ名全体を表し、$1 は最初の / の左側で空、$2 が root になります。以下同様です。 この分割したディレクトリ名の要素を print 文で shell で実行する コマンドに組み立て、 shell に入力して実行します。 パイプでつないでいるコマンドをひとつづつ実行するとわかるのではないでしょうか。

参考URL:
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/awk/intro/
tanpopo012
質問者

お礼

完璧に動作しました。頂いたURLで勉強します。ありがとうございました。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

find で処理対象を見つけ、awk でコマンドを組み立て、最後に sh で 実行するというのが、好みです。 下記でどうでしょうか。 find /root/data -type d -a -name 'HELLO' | awk -F/ '{print "cd " $0 "; tar zcf /home/backup/" $4 ".tar.gz ."}' | sh 最後の | sh の前までを実行すると、どのようなコマンドを実行するの か事前にチェックできます。

tanpopo012
質問者

お礼

すみません、もうひとつ、tarballの保存先を /home/backup としていましたが、 /home/backup/11-09-2008 のように、今日の日付を挿入したディレクトリーにしたいと思います。 #!/bin/sh DAY=`date +%m-%d-%Y` find /root/data -type d -a -name 'HELLO' | awk -F/ '{print "cd " $0 "; tar zcf /home/backup/$DAY" $4 ".tar.gz ."}' | sh とやっても、 $DAY は日付が代入されず$DAYのままで、 バックアップデータは /home/backup に出来てしまいました。 引き続きご教授宜しく御願い致します。

tanpopo012
質問者

補足

完璧に動作しました。芸術的。。 しかし何故この記述がこういう動作をするのかチンプンカンプンです。。できましたらコマンドごとに区切って、解説願えないでしょうか。。。

関連するQ&A