大文字と小文字を区別せずにディレクトリを探す

大文字と小文字を区別せずにディレクトリを探す

名前で始まるディレクトリを一覧find表示するコマンドを作成しようとしていますが、大文字と小文字を区別しないでください(rhel v7)。これを行う方法はありますか?/homeadm_find

答え1

この-inameオプションはあなたが探しているものです。

find /home -iname 'adm_*'

-type dディレクトリの制限を追加します。

find /home -iname 'adm_*' -type d

答え2

パターンに一致する名前で実行したい操作に応じて、2つの方法でこれを実行できます。

単に印刷したい場合は、Linuxシステムで-iname代わりに使用してください-namefind

find /home -type d -iname 'adm_*'

次の目的で使用するにはfind:

find /home -type d -iname 'adm_*' -exec sh -c '
    for dirpath do
        # use "$dirpath" here
    done' sh {} +

これにより、大文字と小文字を区別しないパターンの下またはすべてのディレクトリにインラインシェルスクリプトが適用されます/home

検索を再帰的に制限したい場合は、検索パスの後に(作業/home前に)挿入することもできます。-maxdepth 1

シェルで直接使用することもできます。を使用すると仮定し、シェルオプションをbash設定します。nocaseglob

shopt -s nocaseglob
printf '%s\n' /home/adm_*/

/homeパターンに一致するすべてのディレクトリパス名は、大文字と小文字を区別せずに印刷されます。末尾は/ディレクトリだけが一致することを保証します。

サブディレクトリ内でも検索するには、オプションを追加に設定してglobstar次を使用します**

shopt -s nocaseglob globstar
printf '%s\n' /home/**/adm_*/

明らかにループで直接使用できます。

shopt -s nocaseglob globstar dotglob nullglob
for dirpath in /home/**/adm_*/; do
    # use "$dirpath" here
done

このdotglobオプションを使用すると、ワイルドカードパターンが隠された名前と一致し(find完了したら)、nullglob一致するものがない場合はパターンが完全に削除されます。

答え3

find非標準拡張をサポートしていない実装では、-iname次のものを使用できます。

find /home -name '[aA][dD][mM]_*' -type d

一部のfind実装(findRHELのGNUを含む)の場合、名前に現在のロケールで有効な文字を形成しないバイトシーケンスを含むファイルは含まれません。行為:

LC_ALL=C find /home -name '[aA][dD][mM]_*' -type d

Cロケールと同様に、すべてのシングルバイト値は有効な文字を形成します。 (そしてa、、、、、はすべて移植可能な文字セットの一部であるため、通常、そのエンコーディングはシステム内のすべてのロケールで一定Aですd。)DmM_

GNU標準と同等の場合は、-maxdepth 1次のことができます。

LC_ALL=C find /home/. ! -name . -prune -name '[aA][dD][mM]_*' -type d

(技術的にはこれは-mindepth 1 -maxdepth 1FreeBSDに似ており、-depth 1 -prune実際に必要なものに近いです(ここでは.深さ0()がパターンと一致しないため除外したくありません))。

関連情報