当我不记得文件或文件夹在哪里时,我有时会使用该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
来仅列出名称中包含该单词的目录或携带一个或多个包含该单词的文件。sort
uniq
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
名称中包含.h
clang
使匿名函数成为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" ]
条件链来排除这些符号链接。