質問では、/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
)、その後に任意の項目(*
)が続きます。つまり、次のものを含むファイルのみただ名前の小文字。
答え2
私は何をしますか:
printf '%s\n' /usr/bin/* |
grep '\<[a-z]*file[a-z]*\>' | grep -Ev '[0-9]|-'
説明する:
grep -v
駅 grep。 2つのモードがあります[0-9]
:-
答え3
2つの解決策:
シェルループ:
for name in /usr/bin/*file*; do
case "${name##*/}" in
*[!a-z]*) ;;
*) printf '%s\n' "$name"
esac
done
/usr/bin
まず、ベース名が一致するパス名のリストを生成し、*file*
そのベース名に小文字以外の文字も含まれていることをテストします。小文字以外の文字が見つからない場合は、パス名が印刷されます。
基準に合ったディレクトリ名を見つけることもできます。あなたが望むものがそうでない場合は、
[ ! -f "$name" ] && continue
ドアの前にあるcase
各非正規ファイルの名前をスキップします。
GNUの使用find
:
find /usr/bin -maxdepth 1 -type f -name '*file*' -regex '.*/[a-z]*$'
これも2つのレベルのフィルタリングを経ます。最初に一致する必要があるデフォルト名に*file*
、次にパス名の末尾に(-regex
フルパス名と一致する)小文字があることを確認してください。
答え4
ls /usr/bin | grep '\<[a-z][^\-]*file[a-z][^\-]*\>'