ls -1
(オプション-1
は1行に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
コマンドを入力すると、プログラム(grepなど)が呼び出される前に、潜在的な変換のいくつかの段階が実行されます。
[
は、一部のシェルの特殊文字です。
$ echo [0-9]
7
ここで起こっていると思うのは、シェルがファイル名の選択として0〜9を展開し、「7」ファイルを見つけて、「7」をgrepに渡していることです。したがって、grepは、ファイル名のどこかに「7」を含むファイル名を探します。
[
をシェルではなくgrepで処理する場合は、文字列を引用するか、シェルをだまして式を別の方法で解析する必要があります。
$ echo [0-9].
[0-9].
引用をお勧めします。
man bash
(for
を探してください)、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
rm
とSudo
をミックスに追加するだけで、キャリアを劇的に変える可能性のある体験をすることができます。