ファイルまたはディレクトリ名に特定の単語が表示されるすべてのディレクトリを一覧表示するコマンドはありますか?

ファイルまたはディレクトリ名に特定の単語が表示されるすべてのディレクトリを一覧表示するコマンドはありますか?

私はファイルやフォルダがどこにあるのか覚えていないときにこのコマンドを使用します。locate(このコマンドはより多くの項目を見つけて、より多くの候補を受け入れるようです。
しかし、私が間違っている可能性があります。)find

しかし、当然、次のような反応がたくさん出てきました。

locate clang
/data/sauvegardes/dev/Java/Experimentations/Angular4/bikes/node_modules/blocking-proxy/.clang-format
/data/sauvegardes/dev/Java/Experimentations/Angular4/bikes/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
/data/sauvegardes/dev/Java/Experimentations/Angular6/ng6-proj/node_modules/blocking-proxy/.clang-format
/data/sauvegardes/dev/Java/Experimentations/Angular6/ng6-proj/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
/data/sauvegardes/dev/Java/Experimentations/blog-demo/node/node_modules/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
/data/sauvegardes/dev/Java/Experimentations/blog-demo/node_modules/blocking-proxy/.clang-format
/data/sauvegardes/dev/Java/Experimentations/blog-demo/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
/data/sauvegardes/dev/Java/Experimentations/ol-ext-angular/.metadata/.plugins/ts.eclipse.ide.server.nodejs.embed.win32.win32.x86_64/node-v6.9.4-win-x64/node_modules/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec

(201 responses)

このコマンドをパイプして、を使用して、名前にdirnameその単語を含むディレクトリのみを一覧表示するか、その単語を含む1つ以上のファイルを渡します。sortuniq

locate clang | xargs -L1 dirname | sort | uniq

効果があります...

/home/lebihan/dev/Java/comptes-france/metier-et-gestion/AdapterInboundWebEtude/etude/node_modules/node-gyp/gyp/tools/Xcode/Specifications
/home/lebihan/dev/Java/comptes-france/metier-et-gestion/AdapterInboundWebEtude/etude/node/node_modules/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications
/usr/include/boost/align/detail
/usr/include/boost/config/compiler
/usr/include/boost/predef/compiler
/usr/lib/linux-kbuild-6.1/scripts
/usr/lib/llvm-14/lib
/usr/lib/postgresql/14/lib/bitcode/postgres/commands
/usr/lib/x86_64-linux-gnu
/usr/local/go/misc/ios
/usr/local/go/src/debug/dwarf/testdata
/usr/local/go/src/debug/elf/testdata
/usr/local/go/src/debug/macho/testdata
/usr/share/doc
/usr/share/doc/libclang1-14
/usr/share/doc/libclang-cpp14

(108 responses)

しかし実際にLinux同じことをより簡単にできるコマンドがありますか?

答え1

さて、GNUシステムを使用している場合は、GNUを使用して出力フォーマットを指定できfindます-printfsort特定のタスクに対して別々のコマンドを使用することは、KISSの概念をある程度満足させるので、それを維持することをお勧めします。しかし、sort存在するので-u省略するuniqことができます。

find . -name '*targetstring*' -printf '%h\n' | sort -u

ディレクトリ名の改行を処理するには、少しの労力が必要です。

find . -name '*targetstring*' -printf '%h\0' |
  LC_ALL=C sort -zu |
  tr '\0' '\n'

LC_ALL=Cまた、有効なテキストで構成されていない、またはユーザーのロケール内の同じ順序の文字を含むファイルパスの問題を回避します。)

デフォルト名だけでなく、パスのどこにでも検索するには、次のよう-nameに置き換えます。-pathtargetstring

-z-printfGNU拡張です。

答え2

zsh殻に

(){ print -rC1 -- ${(u)@}; } **/*clang*(ND:h)

.を含む名前がprint r列に1 C表示されます。uhclang

匿名関数を次のようにしますprintu(forユニークな印刷)それらの1つを教えてください:

printu() print -rC1 -- "${(u)@}"

あなたがそれを書くことができます:

printu **/*clang*(ND:h)

ファイルヘッダーの場合(デフォルト名だけでなく)以下が含まれますclang

set -o extendedglob
printu **/*~^*clang*(ND:h)

~そこはどこにいますか?とは別に拡散演算子^いいえ拡散演算子)。

答え3

私が知っている限り、あなたの要件を満たす項目はまだありません。ただし、ソリューションを作成できる場合は、それをコマンド(関数またはスクリプト)に変換できます。

.bashrcたとえば、これはあなたまたはそれに対応する定義に含めることができますdlocate

dlocate() {
    locate -0eb -- "$1" |
        while IFS= read -d '' -r x; do [ -d "$x" ] && printf '%s\n' "$x"; done
}

あるいは、そのスクリプトを作成して、ディレクトリにリストされているディレクトリの1つに入れることもできます$PATH(私は通常$HOME/binまたはを使用します/usr/local/bin)。

いずれにしても、このコマンドは指定された名前のフラグメントを含むディレクトリをdlocateデータベースから取得します。locateたとえば、次を含むすべてのディレクトリ名と一致しますnet

dlocate net

私のシステムには、次のディレクトリが含まれています。

/usr/include/net
/usr/share/doc/update-inetd
/usr/share/pixmaps/nethack

このループはそのフィルタに一致するすべてのファイルとディレクトリを返すため、whileディレクトリ以外のすべての項目を除外する必要があります。locateディレクトリへのシンボリックリンクを見つけましたが、条件付きチェーン[ -d "$x" ]に展開してそれを除外できます。[ -d "$x" ] && [ ! -h "$x" ]

関連情報