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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

3回答

2778閲覧

この処理をを繰り返し行うスクリプトはないでしょうか?

dame-dame

総合スコア78

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

1クリップ

投稿2017/08/22 23:17

この処理をを繰り返し行うスクリプトはないでしょうか?

いま ルートディレクトリ / にいるとします
/ はいかには100個のフォルダが有り、100個のフォルダの配下には100のtxt ファイルがあります。

これらのtxtファイルは "unko-20170822.txt"規則的な名前が付けられています。

①各フォルダに移動 cd /フォルダ名
②catコマンドでtxtを結びつけて それにたいして unko.sh というシェルスクリプトを実行する
シェルスクリプトは/にあるunko.shとします。

"cat ./unko-*.txt | ../unko.sh

③ cd .. コマンドで /に戻り ①②を他のフォルダに有るtxtに実行する

これを繰り返していると

cd /フォルダ名1
cat ./unko-*.txt | ../unko.sh
cd ..

cd /フォルダ名2
cat ./unko-*.txt | ../unko.sh
cd ..

と100個もあるフォルダに同じ処理をするスクリプトを書かなければなりません。
もう少し短く書く方法はありませんでしょうか?

お知恵をいただけたら幸いです

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

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

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

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

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

archiver

2017/08/22 23:27

ルート配下のディレクトリの深さはどのくらいですか?実行イメージを見ると1階層みたいですが、1階層でいいですか?
hotta

2017/08/22 23:52

1.フォルダ名の規則性はありますか?もしくは、ルート直下の全フォルダを対象にしていいんでしょうか? 2.各フォルダ直下のすべてのテキストファイルをくっつけていいんでしょうか?すべてではまずい場合はファイル名の規則をもう少し厳密に規定すべきかと。
guest

回答3

0

Bash

1for d in * 2do if test -d "$d" 3 then pushd "$d" 4 cat unko-*.txt | ../unko.sh 5 popd 6 fi 7done

1.カレントディレクトリの全てのファイルについて
2.それがディレクトリなら
3.そのディレクトリに移動し
4.処理を実行
5.ディレクトリを戻り
6.繰り返す

投稿2017/08/23 05:02

編集2017/08/23 05:18
otn

総合スコア84557

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

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

tsuemura

2017/08/23 05:13

pushであってます?pushdでなく?
otn

2017/08/23 05:19 編集

すいません。タイプ漏れしてました。修正しました。
guest

0

フォルダのリストを取得するには

find -type d -maxdepth 1 -mindepth 1

です。
-maxdepthはなんとなく分かると思いますが、いくつめの階層まで掘るかを指定します。
-mindepth 1を指定すると、今いるディレクトリ.を除外してくれます。

こちらをforで繰り返すだけですので、

for DIR in `find -type d -maxdepth 1 -mindepth 1` do cd $DIR cat ./unko-*.txt | ../unko.sh cd .. done

のようにすると良いでしょう。
それにしてもファイル名ばっちいですね!

投稿2017/08/22 23:57

tsuemura

総合スコア663

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

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

0

ディレクトリ個別の処理が無く、単に「unko-.txt」の入力が欲しいだけなら、
下記で全部の「unko-
.txt」を連結して実行できます。高速だと思います。

ls -l | sed -n '/^d/p' | awk '{print "./" $9 "/unko-*.txt"}' | eval cat `xargs -n1` | ./unko.sh

=========================================================================
実行例
空ファイルつないでるので、そりゃ速いんですが、中身が有ってもそこそこ速いと思います。

$ ls
test1 test14 test2 test25 test30 test36 test41 test47 test52 test58 test63 test69 test74 test8 test85 test90 test96
test10 test15 test20 test26 test31 test37 test42 test48 test53 test59 test64 test7 test75 test80 test86 test91 test97
test100 test16 test21 test27 test32 test38 test43 test49 test54 test6 test65 test70 test76 test81 test87 test92 test98
test11 test17 test22 test28 test33 test39 test44 test5 test55 test60 test66 test71 test77 test82 test88 test93 test99
test12 test18 test23 test29 test34 test4 test45 test50 test56 test61 test67 test72 test78 test83 test89 test94
test13 test19 test24 test3 test35 test40 test46 test51 test57 test62 test68 test73 test79 test84 test9 test95

$ for DIR in ls;do touch "$DIR"/text{1..100}.txt; done

$ time ls -l | sed -n '/^d/p' | awk '{print "./" $9 "/*.txt"}' | eval cat `xargs -n1` >/dev/null 2>&1

real 0m0.372s
user 0m0.188s
sys 0m0.203s

投稿2020/07/18 10:17

編集2020/07/18 10:54
hana_yama_san

総合スコア923

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

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

hidezzz

2020/07/18 10:44

ソースコードやコマンド実行結果などMarkdown記法として解釈されては困る部分は「```」で始まる行で前後をはさんでください。 ``` echo '「```」で囲まれた部分にソースコードなどを書く' ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問