私がディレクトリ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
失敗します。basename
GNUは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
現在の作業ディレクトリであると仮定していますが、それが問題の場合であると言っているので問題ではありません。