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

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

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

4回答

6611閲覧

シェル - findして見つかった後の処理をどう書けば良いですか?

keys

総合スコア215

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

1クリップ

投稿2018/05/11 23:28

編集2018/05/11 23:31

シェルスクリプト 初心者のものです。下記のようにシェルコマンドを実行すると、カレントディレクトリ以下に存在する「word」ディレクトリを再帰的に探してきてくれます(いくらディレクトリ構造が深くても、ちゃんとカレントディレクトリ以下のwordディレクトリのパスを全て取ってきてくれて助かっています)

shell

1 find ./ -name "*word" -type d

上記のコマンドを実行してwordディレクトリが見つかった後の処理をシェルスクリプト として書きたいと思っています。カレントディレクトリ下のwordディレクトリの中にある、ファイルだけ取得したいという書き方を、シェルスクリプト だとどのように書くのでしょうか。

流れとしては下記のような感じです

1 カレントディレクトリ以下に存在する「word」ディレクトリを再帰的に探す 2 もし「word」ディレクトリが見つかったら、その中を調査 3 指定した条件にマッチするファイルがあればそれを取得

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

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

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

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

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

guest

回答4

0

$ mkdir aaaword $ mkdir bbbword $ find . -name '*word' -type d ./aaaword ./bbbword $ for i in $(find . -name '*word' -type d); do echo $i; done ./aaaword ./bbbword $ find . -name '*word' -type d | xargs -n 1 -I@ echo @ ./aaaword ./bbbword

やり方の一つとして、サブシェルでfindを実行してその出力をfor文でぶん回すって方法があります。
ただこれは「サブシェルが終わるまでfor文が回り始めないので遅い/メモリを使う」「コマンドラインの文字数制限に引っかかることがある」という問題があります。

別のやり方としてはfindの出力をxargsにパイプして、xargsにぶん回してもらう方法があります。
この方法では前述の問題が無いので、方法としてはこっちのほうが良いです。

※ディレクトリ名の半角スペースを警戒するなら別の工夫が必要です。
http://d.hatena.ne.jp/pasela/20120122/xargs

投稿2018/05/11 23:43

編集2018/05/11 23:46
set0gut1

総合スコア2413

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

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

0

ベストアンサー

標準的な方法については既にコメントがあるので、ちょっと変化球を投げてみます。

find2perl でperlスクリプトやシェルスクリプトを呼び出す

find2perlは、findコマンドを模倣したコマンドライン書式を受け取り、findするかわりに、その機能をもつperlスクリプトを生成するスクリプトです。
このスクリプトの中を少し書き換えて、シェルスクリプトを下請けに呼び出すことができます。

まず、次のようにして雛形スクリプトを得ます。

$ find2perl ./ -name "*work" -type d > test.pl

このtest.plをエディタで開くと、最後が次のようになっています。

(前略) sub wanted { my ($dev,$ino,$mode,$nlink,$uid,$gid); /^.*work\z/s && (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && -d _ && print("$name\n"); }

findの書式に従い、wanted関数の内容は見つかったファイルの名前を出力するものとなっています。
これを目的に合わせて加工します。
$nameに見つかったファイル名、$dirに検索対象のディレクトリ名(-dで指定したもの)が代入されているので、これを活用してperlで処理してもいいし、
system()を利用して、見つかったファイルごとにシェルスクリプトを呼び出すこともできます。

以下は、findされたディレクトリ下の*.txtをシェルを通してリストアップしてみた例です。

(前略) sub wanted { my ($dev,$ino,$mode,$nlink,$uid,$gid); /^.*work\z/s &&                     # ファイル名での選択条件が正規表現で書かれている。拡張正規表現を使って、超絶複雑な条件設定にレベルアップすることもできる。 (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&  # 必要なら各種ファイル属性情報も利用できる -d _ && system(qq( ls $name/*.txt )) #qq()の間にシェルスクリプトを普通に書ける。'や"のエスケープも必要ない。 }

bash/shのかわりにzshを使う

zsh最強。
たとえば、カレントディレクトリ以下で名前がworkで終わるサブディレクトリ下の*.txtを列挙したいなら、下の一行でOKです。

ls ./**/*work/*.txt

投稿2018/05/12 07:22

KojiDoi

総合スコア13671

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

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

0

自分だったらこんな感じかなあ

#/bin/sh find ./ -name "*word" -type d | \ while read d do # $d にディレクトリ名が入るので # それを使ってなんか処理する done

投稿2018/05/12 00:51

takasima20

総合スコア7458

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

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

0

いろいろは方法がありますが、私がよく使う方法は、

find . -type f >file.txt

でfile名をtext fileに入れます。そのあとはfile.txt をエディタで編集したり、対象fileの数が少ないときは、そのまま手で処理します。
エディタでの編集が面倒な時は、sed / gawk / perl で操作してshellに渡します。例えば、grep work {file}であれば、

find . -type | sed 's/^/grep work ' | sh

みたいにします。 find には任意のコマンドを実行する機能もあるのですが、引用符を含む時の記述が大変なので使っていません。ファイルを消去したい時など、元にもどるのが大変な時には、sh に直接入れずにまず目で確認します。xarg する方法、gawk / perl の中でコマンドを呼んだり、もっと複雑な処理をすることもできますが、この辺りが入り口かと。

この答えが気に入ったら、評価と解決済みをお願いします。

投稿2018/05/11 23:52

gm300

総合スコア580

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問