3文字で終わるディレクトリまたはファイルを探す

3文字で終わるディレクトリまたはファイルを探す

次のコマンドを使用して、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 1findが/ 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

これらの名前を再帰的に検索するには、(でbashshopt -s globstarワイルドカード**モードを有効にし(サブディレクトリと再帰的に一致)、次のようにします。

ls -ld /etc/**/*???

デフォルトでは、この**モードはシェルで有効になっていますzsh

到着するこれらの名前を持つもの(電話ではなく)の場合はlsループを使用してください。

shopt -s globstar
for pathname in /etc/**/*???; do
    # use "$pathname" to do something
done

dashshell または plain でshこのループに対応するものは次のとおりです。

find /etc -name '*???' -exec sh -c '
    for pathname do
        # use "$pathname" to do something
    done' sh {} +

関連:


使用法にgrepよると、正規表現とファイル名のグロービングパターンを混同しているようです。正規表現では、点(.)は単一の文字と?その文字のみと一致します?(少なくともデフォルトの正規表現ではこれがgrepデフォルトで使用されます)。

$ファイル名パターンも常に固定されているため、正規表現でasを使用してパターンを明示的に固定する必要はありません(ただし、パターンは完全なファイル名と一致する必要があるため、そのxyz名前はもちろん*xyzname matchで終わるすべてのファイルと正確に一致します。xyz)。 。

関連:

答え3

find以下を使用して結果をフィルタリングできます。

find -type f | egrep '3$|4$|5$'

関連情報