実際、私は以前の投稿に関連しています。特定のファイル拡張子を検索してディレクトリをソートするこれはまだ答えがありません。この問題を解決するにはいくつかのオプションがありますが、while
特にループに興味があります。現在の作業ディレクトリから何かをループでスキャンして特定のファイルがあるかどうかを検索し、そのwhile
フォルダ名のみを印刷したいと思います。現在、作業ディレクトリには多くのフォルダとサブフォルダがあります。これは私のスクリプトです。
while IFS= read -r d; do
if [[ "$d"=="*.out" && grep "index123"]]; then exit 1; fi
done << (find . -prune -type d)
if
強制がループ内で、または他の方法で実行する正しい方法であるかどうかわかりません。ご案内ください。
ベストアンサー1
grepが失敗する理由
端末で次の操作を行います。
失敗 - 入力待機中$ grep "index123"
作業中 - STDINから入力を受け取る
$ echo -e "line1\nline2\nindex123blah\n" | grep "index123"
index123blah
2番目は、grep
STDINを介して解析された入力を提供するために機能します。grep
入力はSTDINまたはファイルから取得されます。あなたのシナリオでは:
if [[ "$d"=="*.out" && grep "index123"]]; then exit 1; fi
また、解析しないので失敗します。
あなたの問題
あなたのコードで判断すると、あなたはこのようなことをしたいと思います。まず、以下はいくつかのサンプルデータです。
$ mkdir -p 1/2/{3..5}
$ echo "index123" > 1/2/3/blah.out
$ echo "index123" > 1/2/3/blip.out
$ echo "index" > 1/2/blip.out
$ echo "index" > 1/2/blah.out
そして、スクリプトの修正された形式は次のとおりです。
$ cat loopy.bash
#!/bin/bash
while IFS= read -r d; do
grep -l "index123" "$d" && exit 1
done < <(find . -type f -name "*.out")
ランニング:
$ ./loopy.bash
./1/2/3/blah.out
index123
文字列を含む最初のファイルをエクスポートしてから終了します。
whileループのための良い解決策はありますか?
私はこれをしません。while
このようにループを使用する必要はありません。find .... | xargs ...
アーキテクチャまたはfind ... -exec
ソリューションタイプを使用することをお勧めします。
バラより@DopeGhotiの返信find
または を使用するより良い方法を得るために-exec
。xargs
インクルードディレクトリの印刷
一致するファイルを含むインクルードディレクトリツリーを印刷するには、dirname
次の手順を実行します。
$ cat loopy2.bash
#!/bin/bash
while IFS= read -r d; do
grep -q "index123" "$d" && dirname "$d" && exit 1
done < <(find . -type f -name "*.out")
そして実行してください:
$ ./loopy2.bash
./1/2/3