特定のファイル拡張子を検索してディレクトリをソートする

特定のファイル拡張子を検索してディレクトリをソートする

私がディレクトリAにあるとします。 Aの下には多くのフォルダ(B、C、Dなど)があり、各フォルダには「* .out」ファイルとサブフォルダがあります。 *.outファイルで "index123"テキストを見つけ、そのフォルダ名をすべて印刷するスクリプトをAで実行したいと思います。

これは私のスクリプトです。

#!/bin/sh  
FILES=home/A  
grep --include=\*.out -rnw $FILES -e "index123" | while read file; do  
str1="FILES/$(basename $file)"  
echo $str1
done

エラーが表示されます。

注:コード行で「検索」を介してこれを実行できますが、表示されたwhileループにエラーが表示されるのはなぜですか?

ベストアンサー1

ディレクトリ構造が次のと仮定します。

A
|-- B
|   |-- file1.out
|   |-- file2.out
|   `-- file3.out
|-- C
|   |-- file1.out
|   |-- file2.out
|   `-- file3.out
|-- D
|   |-- file1.out
|   |-- file2.out
|   `-- file3.out
`-- E
    |-- file1.out
    |-- file2.out
    `-- file3.out

コードの問題は、grep次のような出力を生成することです。

./B/file1.out:2:some data which includes the word index123
./B/file2.out:2:some data which includes the word index123
./B/file3.out:2:some data which includes the word index123
./C/file1.out:2:some data which includes the word index123
./C/file2.out:2:some data which includes the word index123
./C/file3.out:2:some data which includes the word index123
./D/file1.out:2:some data which includes the word index123
./D/file2.out:2:some data which includes the word index123
./D/file3.out:2:some data which includes the word index123
./E/file1.out:2:some data which includes the word index123
./E/file2.out:2:some data which includes the word index123
./E/file3.out:2:some data which includes the word index123

これが出力です

grep --include=\*.out -rnw . -e "index123"

A現在のディレクトリに。

その後、これらの別々の行で実行しようとしますが、最大2つの引数(対応するパス名から削除されたパス名とサフィックス)が必要なため、basename失敗します。basenameGNUはbasename「追加オペランド」について文句を言い、BSDはbasename誤った使用法について文句を言うでしょう。


grepフラグと一緒に使用すると、ファイル名が表示されます(ただし、一致する行全体ではありません)-l

これは、スクリプトを単一のコマンドに置き換えることができることを意味します。

grep -w -l "index123" */*.out

これにより、フォームに出力が提供されます。

B/file1.out
B/file2.out
B/file3.out
C/file1.out
C/file2.out
C/file3.out
D/file1.out
D/file2.out
D/file3.out
E/file1.out
E/file2.out
E/file3.out

コマンドラインで使用するもの-wを追加しました。 (また、使用中の番号が付けられた行の場合)はと一緒に使用することはできません。grep-n-l

あなたのコードで判断すると、これはあなたが望むものです。

フォルダ名のみが必要な場合は、次の操作を行います。

$ grep -w -l "index123" */*.out | sed 's#/[^/]*##' | sort -u
B
C
D
E

これはすべてこれがA現在の作業ディレクトリであると仮定していますが、それが問題の場合であると言っているので問題ではありません。

おすすめ記事