1

ディレクトリに3つのファイルがあります。

a.html

<html>
    a    
</html>

b.html

<html>
    b
</html>

htmlfile

これは単なるhtmlファイルです

ファイル名拡張子が.htmlではないファイルを取得したいので、使用するコマンドは次のとおりです。

ls|grep -v *html

しかし、結果は次のとおりです。

<html>
    b
</html>

なぜ?

ありがとうございました。ls|grep -v *htmlしかし、なぜの内容を印刷するのかわかりませんb.html。このコマンドがで終わるファイルの内容を印刷する場合.html、なぜの内容を印刷しないのa.htmlですか?

4

4 に答える 4

4

引用符を付けなかったため*html、シェルはコマンドを次のように展開します

ls | grep -v a.html b.html

ここで、grepは2つの引数で呼び出されるため、stdinは無視されます。したがって、結果は次のようになります。

grep -v "a.html" b.html

の内容を出力しb.htmlます。


編集

それを機能させるには、次のいずれかを使用します

ls | grep -v "html$"
# Note that html$ is the regexp equivalent to the shell pattern *html

また

shopt -s extglob # turn on extended globbing
ls -d !(*html)
于 2012-06-15T04:08:49.223 に答える
2

使用する

ls | grep -v .html

.htmlこれにより、拡張子が付いた名前が除外されます。

クイックテスト

$ ls
a.html  b.html  htmlfile

$ ls | grep -v .html
htmlfile
于 2012-06-15T03:34:46.687 に答える
1

これでうまくいくはずです:

ls -1 | grep -v '.html$'
于 2012-06-15T03:37:39.460 に答える
0

これはシェルグロブと関係があります。なぜgrep -vこのように動作するのか正確にはわかりませんが、ArchLinuxzshでの同様の結果を次に示します。

ls | grep -v *html
    <html>b</html>
grep -v *html
    <html>b</html>

それらは同じ結果になることに注意してください。grepコマンドは、現在の作業ディレクトリで動作しており、引数としてシェルグロブ文字(*)を使用しています。lsからのパイプはそれとは何の関係もありません。これは出力に含まれますが、grepはそれを破棄します。

これがどのように機能するかをより明確に確認するには、ディレクトリを上に移動して次のように発行します。

ls <dirname> | grep -v *html
    zsh: no matches found: *html

編集:これが発生する理由については、Pumbaa80の回答を参照してください。

于 2012-06-15T04:30:21.600 に答える