はじめまして、ペンギンと申します。
最近Linuxを使い始め、ごく簡単なシェルを書いています。
どうしても躓いてしまった事があり、相談させていただきます。
問題は、grepのエラーでシェルが止まってしまう事です。
■シェルの目的■
grepであるディレクトリの中にある大量のファイルから
特定のキーワード(複数)を含むファイルを抽出する事
■目的以外にやりたいこと■
エラーや文字化けの原因となる
「スペース」や「全角文字」を含むファイル名とディレクトリ名
(以下:化けファイルと呼びます)は除外し、
尚且つそのファイル名をリストアップしながら検索を行いたい
※日本語名や半角スペースで命名されたファイル及び
ディレクトリが複数存在する
【経緯】
最初:目的だけ満たすシェルを作った
⇒実際のディレクトリに適用したら止まった
⇒原因を調べたら化けファイルが複数見つかる
⇒ファイル名を“”で囲んで検索することでエラー回避
⇒やっぱり化けファイルは今後使いたくないからリストアップすべきだ!
⇒化けファイル出そうとしたら途中で“処理止まる” ←★いまここ
=========================================
#!/bin/sh
TARGET=$1(検索対象ディレクトリ)
TMP=xxxx.log (findをwhile readするための一時ファイル)
ERRORFILE=xxxx_error.list(化けファイルを控えておくログ)
{中略}
find "${TARGET}" -type f > ${TMP}
cat "${TMP}" | while read filepath
do
GREPERROR=`grep "${TARGET}" ${filepath}` if [ $? -eq 2 ]; then echo "error grep,${filepath}" >> "${ERRORFILE}" continue fi
{キーワード抽出部分は中略}
done < $TMP
grepできなかったファイル=化けファイルだったため、
GREPERRORの処理でgrepの戻りが2ならその回は抜ける
と書きたかったのですが…。
この状態で動かすと${TMP}リスト中で化けファイルが出てきたファイルより
下にあるファイルにwhile readが続いていきません。
ちなみに
GREPERROR=grep "${TARGET}" ${filepath}
GREPERROR=grep "${TARGET}" "${filepath}"
にするとそのまま動作して処理を終了しますが、化けファイルをふるいにかけることができません。
そもそもgrepだけでなんとかしようとすることに無理があるのかもしれません。
勉強不足であることこの上ないのですが、
どなたかお知恵をお貸し頂けませんでしょうか。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。