質問では、/usr/bin
ファイル名に英語の小文字のみが含まれ、「file」という単語を含むすべての保存されたファイルを一覧表示したいと思います。
たとえば、出力にnsrfile
andが必要です。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 Name
grepによって除外されます。)この点を人工的な例で説明するには、次の手順を実行します。
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
上記の例では、ls
grepのパイプに次のものが記録されています。
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
)、その後に任意の項目(*
)が続きます。つまり、次のものを含むファイルのみただ名前の小文字。