bashスクリプトに以下を作成しようとしています。
#!/bin/bash
find /path/to/file -type f -name "*.html" -exec grep -l "XXXX" '{}' \; -print
ここで、XXXXはこのコマンドを繰り返す必要がある文字列のリストです。私はスクリプトの正しい部分をループに入れるのに苦労しました。
答え1
zsh
タグを使用しましたが、#!/bin/bash
shebangを使用しました。 2つの異なる殻がありますbash
。zsh
grep
複数の文字列を見つける1つの方法は、を使用して呼び出すことですgrep -F -e 'first string' -e 'second string' -e'blah'...
。
zshの配列に文字列リストがある場合:
strings=('first string' 'second string' '***')
あなたはできます:
GNUの使用grep
:
grep -Frl --include='*.html' -e$^strings .
または以下を使用してくださいfind
。
find . -name '*.html' -type f -exec grep -Fl -e$^strings {} +
または、zsh
再帰的なglobbingとglob修飾子を使用します。
grep -Fl -e$^strings -- **/*.html(D.)
あるいは、引数の数に対するシステム制限を解決するには、htmlファイルが多い場合はfind
's 'のようなコマンドを渡すことができます。-exec
autoload -Uz zargs
zargs -- **/*.html(D.) -- grep -Fl -e$^strings --
これはファイルリストをソートできるという利点もあります(ot rderoN
にglob修飾子を追加することでこのソートを無効にすることができます)。N
o
-l
すでに印刷されているファイル名には一致する1つ以上のaddが含まれているため、成功する-print
と印刷されたファイル名は重複grep
してファイル名が2回印刷されることを意味します。
答え2
そのディレクトリ内のすべての.htmlファイルでXXXXで表される文字列を見つけ、文字列が発生したファイルを返すにはgrep
十分です。
egrep -l "string1|string2|string3" /path/to/directory/*.html
grep -El "string1|string2|string3" /path/to/directory/*.html
どちらも同じことを行いますが、代わりにegrep
使用しますgrep -E
。この-l
スイッチは、文字列を含む行ではなく、文字列が表示されるファイルを返します。文字列を変数に割り当てる必要がある場合:
export strings='string1|string2|string3'
egrep -l "$strings" /path/to/directory/*.html
grep -El "strings" /path/to/directory/*.html
答え3
検索したい文字列を含むファイルを使用できます。
ファイル.txt
foo
bar
それから
find /path/to/file -type f -name "*.html" -exec grep -l -f file.txt '{}' \; -print
答え4
文字列を使用できるファイルに対して操作を実行するには、次のコマンドを使用します。
#!/bin/bash
declare -a STRINGS=$(find /var/www/html/ -type f -name "*.html" -exec grep "this is
test" {} \; -print)
for string in "${STRINGS[@]}"
do
echo "${string}"
echo "${STRINGS}"
done
出力:
[root@awx html]# sh test.sh
this is test file1
/var/www/html/1.html
this is test file2
/var/www/html/2.html
this is test file1
/var/www/html/1.html
this is test file2
/var/www/html/2.html
[root@awx html]#