質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

1283閲覧

複数フォルダ配下のファイルを各フォルダ名でtar.gzで圧縮したい。(tar.gz内にはファイルのみ)

hidenoriZ

総合スコア7

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2018/03/23 11:20

はじめまして。初心者です。
シェルによる作業を行っておりますが上手く出来ず
みなさまのお知恵をお借り致したく投稿させて頂きます。

前提・実現したいこと

複数フォルダaaa~配下の*.csvを
aaa~.tar.gzにする作業をしております。

解凍時にaaa~フォルダが含まれないように
したいです。

例)
tar -czvf aaa~.tar.gz した際に
aaa~/*.csv
aaa~/*2.csv
ではなく以下のようにいきなりファイル
*.csv
*1.csv
となるイメージです。
※都合により、解凍側はコマンド変更出来ません。

試して見たのは、簡単ですが以下のような感じです。

for i in find -type d -name aaa*
do 'tar -zcvf "${i}".tar.gz "${d}"/.*csv'; done

補足情報(FW/ツールのバージョンなど)

CentOS6.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

「サブディレクトリを順次下っていきながら、下って行った先のファイルについて何らかのややこしい処理を行う」場合に役立つ手法を一つ紹介しましょう。perlを使いますが、perlの知識はなくてもOKです。

  1. find2perlでperlスクリプトを作成
  2. 適当なシェルスクリプトを呼び出すよう書き換え
  3. perlスクリプトを実行

find2perlはfindと同じような書式でコマンドラインオプションを受け付け、ファイルの検索を実行する代わりに、それを実現するためのperlスクリプトを生成します。

find2perl /hoge -type d -name 'aaa*' > test.pl

こうして作成したスクリプト(test.pl)を見ると、最後が

&& print("$name\n");

となっています。ここを次のように好きなシェルスクリプトを呼び出すように書き換えます。たとえば、

&& system("echo Current directory is `pwd`. Found file is $name");

こうして書き換えたtest.plを実行すると

perl test.pl

カレントディレクトリを移動しながら、みつかったファイルごと(ここではサブディレクトリですが)シェルスクリプトが実行されているのがわかります。変数$nameに見つかったファイル名が入ることさえ覚えておけば、当該ファイルを対象にtarでもzipでも好きなコマンドを実行できます。

投稿2018/03/23 14:08

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidenoriZ

2018/03/24 05:48

perlも平行して勉強できればとおもっていました。 サブディレクトリを探っていきながら。。 正にやりたいことでした!ありがとうございます!
guest

0

こんな漢字で、

bash

1$ find . -type d -name 'aaa*'|xargs -I@ sh -c 'cd @&&tar czvf ../@.tar.gz *.csv'

投稿2018/03/23 12:05

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidenoriZ

2018/03/24 05:56

cdを使えばよかったんですね。。 ありがとうございます。 凄くシンプルな例で分かり易くて助かります。
guest

0

ベストアンサー

for i in find -type d -name aaa*

do 'tar -zcvf "${i}".tar.gz "${d}"/.*csv'; done

フォルダが含まれる含まれない以前に、コマンドの体をなしていません。

ディレクトリ内のファイル全部であれば、tar cvfz $i.tar.gz -C $i .で良いのですが、*.csvだけとなると、cdしないといけないと思います。

Bash

1for i in `find -type d -name "aaa*"` 2do cd "$i" 3 tar cvfz ../"$i".tar.gz *.csv 4 cd .. 5done

投稿2018/03/23 12:04

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidenoriZ

2018/03/24 05:59

ありがとうございます。 ご指摘の通り、まだ理解が浅く勉強したいと思います!試したことを修正頂いて理解しやすく助かります!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問