「ls -a |」の奇妙な動作 grep ^ \。」


10

pwdのコンテンツをリストし、ドットで始まるファイルのみを表示したいと思いました。試しましたls -a | grep ^\.が、ドットで始まらないファイルが出力に含まれる理由がわかりません。例えば:

Pictures
.pip
.pki
.profile
projects
Public

自分がやりたいことを達成できることはわかってls -ld .*います。説明できないgrepのこの動作に興味があります。



ls -d .*始まるすべてのファイルを一覧表示するだけでは.どうですか?
Barmar

注意事項:lsの出力を別のコマンドにパイプしないでください。代わりに検索を使用してください。lsには、信頼できないほど多くのイデオシンクラシーがあります。参照:mywiki.wooledge.org/BashPitfallsの Pitfall 1-1位になりました!サイトの残りの部分も素晴らしいです。
ジョー

回答:


20

への引数を引用しgrep、したがってls -a | grep '^\.'

この理由は、シェル\.がそれを処理してplainに戻し.、これgrepが単一文字のワイルドカードとして扱われるためです。疑わしい場合は、常にシェルに特有の文字を含む(または含む可能性がある)文字列を引用してください。


シェルはなぜ\を無視するのですか?
ps-aux 2015

\は、シェルが後続の文字をリテラル文字として扱うようにするエスケープシーケンスです。この例ではgrep ^\\.、\\はシェルによって単一のバックスラッシュとして扱われ、grepは単一のバックスラッシュとそれに続くドットをリテラルドットとして扱います。
Avinash Raj 2015

11

grep regexを引用符で囲む必要があります。

ls -a | grep '^\.'

注:command の出力を解析しないでくださいls


lsの出力を解析するのはなぜ悪いのですか?
ps-aux 2015

リンクから:デフォルトのモードでは、標準出力が端末でない場合、lsはファイル名を改行で区切ります。名前に改行が含まれるファイルが作成されるまで、これで問題ありません。
Michael Durrant 2015

@Michael Durrant:ファイル名の改行を許可することは、システムの大きなバグであることをお勧めします。
jamesqf 2015

@jamesqf- ファイル名の改行を確認します(特にsmlの回答)。
don_crissti

0

cmd ls -a | grep ^ \。その場合、grepは「\」を特殊文字および「。」の意味と見なしません。脱出しないでください。

cmd ls -a | grep "^ \。" 次に、grepは「\」を特殊文字および「。」の意味と見なします。エスケープされます。期待どおりの結果が得られます。

引用符なしでgrep cmdを使用する場合は、「\」文字もエスケープする必要があります。次のコマンドを実行すると、二重引用符なしで期待どおりの結果が得られます。 ls -a | grep ^ \\。

正規表現での特殊文字の意味の詳細については、次のリンクを参照してください。 http://www.regular-expressions.info/quickstart.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.