是否存在列出某个单词出现在文件名或目录名中的所有目录的命令?

是否存在列出某个单词出现在文件名或目录名中的所有目录的命令?

当我不记得文件或文件夹在哪里时,我有时会使用该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来仅列出名称中包含该单词的目录或携带一个或多个包含该单词的文件。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 系统上,您可以使用 GNUfind-printf指定输出格式。坚持下去sort很好,因为针对特定任务使用单独的命令在某种程度上满足了 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-path可查找targetstring路径中的任何位置,而不仅仅是基本名称。

-z-printf是 GNU 扩展。

答案2

zsh壳里

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

print r在列中1 C显示u名称中包含.hclang

使匿名函数成为printu(对于印刷独特)将其中一个命名为:

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
}

或者您可以创建一个相应的脚本并将其放入您的目录中列出的目录之一$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" ]条件链来排除这些符号链接。

相关内容