web-dev-qa-db-ja.com

grepを使用してフォルダを番号でフィルタリングする

ls -1 (オプション-11行に1つのファイルをリストする)grepを介して(findでも実行できることはわかっていますが、この例のためにgrepに固執したいと思います)

フォルダは

PC:test user$ ls -1
1184
36
69929
7
9907

今、これは私がさまざまな出力で得たものです...

これ:なぜ9907がそこにあるのかわかりません。どういうわけか、1桁の7フォルダーだけが意味をなすのでしょうか。

PC:test user$ ls -1 | grep [0-9]
7
9907

これは欠落しています。7。.は2以上を意味しますか?

PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907

これは、すべてがそこにある数字と一致することを意味しますか?

PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907

引用符で囲むと、期待どおりに機能します。なぜですか。 [0-9].*と同等ですか?

PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
2
cele_82

「ファイル名の置換」または「パス名の展開」または「グロブ」

コマンドを入力すると、プログラム(grepなど)が呼び出される前に、潜在的な変換のいくつかの段階が実行されます

[は、一部のシェルの特殊文字です。

$ echo [0-9]
7

ここで起こっていると思うのは、シェルがファイル名の選択として0〜9を展開し、「7」ファイルを見つけて、「7」をgrepに渡していることです。したがって、grepは、ファイル名のどこかに「7」を含むファイル名を探します。

[をシェルではなくgrepで処理する場合は、文字列を引用するか、シェルをだまして式を別の方法で解析する必要があります。

$ echo [0-9].
[0-9].

引用をお勧めします。

man bashforを探してください)、man test、および this の151ページも参照してください。


正規表現

正規表現では、.は「任意の1文字」を意味します。したがって、[0-9].は、任意の数字の後に1文字が続くことを意味します。ファイル名7には後者がありません。


Grepで1桁のファイル名を検索する場合は、式を行の先頭と末尾の両方に固定する必要があります。

$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

$ ls -1 | grep '^[0-9]$'
7

おっと、コンピューターを破壊しました

特殊文字を不用意に使用すると、あらゆる種類のエキサイティングな結果が得られます

$ ls -1 > x
$ grep *
x:1184

あなたが考えるならば、これはより明確になるはずです

$ ls -1
1184
36
69929
7
9907
x

$ echo *
1184 36 69929 7 9907 x

rmSudoをミックスに追加するだけで、キャリアを劇的に変える可能性のある体験をすることができます。

4
RedGrittyBrick