質問 - -grepを使用してディレクトリ内のファイルを一覧表示する

質問 - -grepを使用してディレクトリ内のファイルを一覧表示する

質問では、/usr/binファイル名に英語の小文字のみが含まれ、「file」という単語を含むすべての保存されたファイルを一覧表示したいと思います。

たとえば、出力にnsrfileandが必要です。file

これを達成するための私のコードは次のとおりです。

ls /usr/bin | grep '\<[a-z]*file[a-z]*\>'

私が得た結果のいくつかは次のとおりです。

file
nsrfile
grub2-file
systemd-tmpfiles

ところで、ファイル名にはスラッシュではなく英語の小文字のみを含めることができるという質問があります。-

grub2-file数字も含まれています

コマンドをどのように変更する必要がありますか?

ベストアンサー1

期待と警告

タスクから得られるgrep結果lsはおそらく次のとおりです。

cd /usr/bin
ls | grep '^[a-z]*$' | xargs grep file

lsファイル名を要求するときは、grep小文字でのみ開始()して終了する()フィルタを使用します。次に、着信する各ファイル名をgrepして、文字列「file」を検索するように要求します。^$*xargs

ファイル名(/usr/binにない可能性が高い)に改行文字が含まれていると、すぐに問題が発生します。 (スペースを含むファイルはSome File Namegrepによって除外されます。)この点を人工的な例で説明するには、次の手順を実行します。

cd ~/tmp/usr/bin
touch a$'\n'b
ls | grep '^[a-z]*$' | xargs grep file
grep: a: No such file or directory
grep: b: No such file or directory

上記の例では、lsgrepのパイプに次のものが記録されています。

a
b

Grepはこれら2つの「ファイル名」をxargsに正しくパイプし、xargsにはgrepの2つのファイル名があると考えて実行されます。

grep file a b

...そしてファイルの欠落について文句を言います。

提案

これは予想されませんが、次のようなより安全なオプションを使用することをお勧めします(bashシェルを想定)。

shopt -s extglob
grep -l file /usr/bin/!(*[^a-z]*)

これが開きますBash用拡張ワイルドカード機能。次に、「file」という文字列を含むファイル名を/ usr / bin()のファイルにgrepリストするように要求します。-lいいえ!)は次のパターンと一致します。 「すべての項目(*)の後にランダムな単一の([ ... ])非(^)小文字(a-z)、その後に任意の項目(*)が続きます。つまり、次のものを含むファイルのみただ名前の小文字。

おすすめ記事