次のコマンドを使用して、3文字で終わるディレクトリまたはファイルを見つけようとします。
ls -l /etc | grep ???$
これはできません、、
3、4、5、6、7...文字で終わるファイルのディレクトリを見つけるには何を入力する必要がありますか?
答え1
find /etc -maxdepth 1 -regextype egrep -regex '.*/.{3}$'
/etc/
これにより、ファイル名またはディレクトリ名が次から検索されます。正確に3文字の長さです。
find /etc -maxdepth 1 -regextype egrep -regex '.*/.{3,}$'
/etc/
その後、次のファイルまたはディレクトリを見つけることができます。最低限度で3文字の長さです。
find /etc -maxdepth 1 -regextype egrep -regex '.*/.{3,7}$'
/etc
これにより、3〜7文字のファイルまたはディレクトリが検索されます。
-maxdepth 1
findが/ etcのサブディレクトリを検索するのを防ぎます。
一致するディレクトリのみを制限するにはを使用します-type d
。-maxdepth 1
一般ファイルの場合-type f
。
見つかったファイル/ディレクトリに対して操作を実行したい場合は、findの-exec
オプションを使用できます。例えば
find /etc -maxdepth 1 -regextype egrep -regex '.*/.{3,7}$' -exec du -sch {} +
またはxargs
(ただし、ファイル名のスペースや改行などの問題を回避するには、NUL区切り文字を使用してください)。これにより、以前にパイプラインで NUL で区切られた入力を処理できるすべてのツールを使用できますxargs
。たとえば、
find /etc -maxdepth 1 -regextype egrep -regex '.*/.{3,7}$' -print0 |
head -z -n 10 |
xargs -0r ls -ld
答え2
3つ以上の文字を含む(つまり、再帰的ではない)単一のディレクトリの名前を一覧表示するには、任意のワイルドカードパターンまたはを使用*???
でき???*
ます*???*
。それぞれは?
単一の文字と一致し、*
それぞれは任意の数の文字と一致します。
/etc
以下にそのような名前をリストするにはls
:
ls -ld /etc/*???
または簡単に言えば、
printf '%s\n' /etc/*???
3 で終わる名前をリストするには特定文字(たとえば)をパターンxyz
として使用します。*xyz
これらの名前を再帰的に検索するには、(でbash
)shopt -s globstar
ワイルドカード**
モードを有効にし(サブディレクトリと再帰的に一致)、次のようにします。
ls -ld /etc/**/*???
デフォルトでは、この**
モードはシェルで有効になっていますzsh
。
到着するこれらの名前を持つもの(電話ではなく)の場合はls
ループを使用してください。
shopt -s globstar
for pathname in /etc/**/*???; do
# use "$pathname" to do something
done
dash
shell または plain でsh
このループに対応するものは次のとおりです。
find /etc -name '*???' -exec sh -c '
for pathname do
# use "$pathname" to do something
done' sh {} +
関連:
使用法にgrep
よると、正規表現とファイル名のグロービングパターンを混同しているようです。正規表現では、点(.
)は単一の文字と?
その文字のみと一致します?
(少なくともデフォルトの正規表現ではこれがgrep
デフォルトで使用されます)。
$
ファイル名パターンも常に固定されているため、正規表現でasを使用してパターンを明示的に固定する必要はありません(ただし、パターンは完全なファイル名と一致する必要があるため、そのxyz
名前はもちろん*xyz
name matchで終わるすべてのファイルと正確に一致します。xyz
)。 。
関連:
答え3
find
以下を使用して結果をフィルタリングできます。
find -type f | egrep '3$|4$|5$'