管道 find 到 grep 通常更方便;它为您提供了用于任意通配符匹配的正则表达式的全部功能。
例如,要查找文件名中包含不区分大小写字符串“foo”的所有文件:
~$ find . -print | grep -i foo
find
还具有用于不区分大小写的通配符、正则表达式和不区分大小写的正则表达式匹配的 -iname
、-regex
和 -iregex
标志,因此无需通过管道连接到 grep
。
find
命令。有时 grep
成为唯一的选择。
find
将查找与某个模式匹配的所有文件:
find . -name "*foo"
但是,如果你想要一张图片:
tree -P "*foo"
希望这可以帮助!
brew install tree
适用于未安装 apt-get
的 Mac OSX 用户
fd
如果 find
太慢,请尝试 fd
实用程序 - 用 Rust 编写的 find
的简单快速替代方案。
句法:
fd PATTERN
演示:
https://github.com/sharkdp/fd/raw/master/doc/screencast.svg?sanitize=true
主页:https://github.com/sharkdp/fd
asciinema
,然后转换为 GIF 格式,但我不确定。
asciicast2vector
可以使用。
find -L . -name "foo*"
在少数情况下,我需要 -L 参数来处理符号目录链接。默认情况下,符号链接被忽略。在这些情况下,这很令人困惑,因为我会将目录更改为子目录并查看与模式匹配的文件,但 find 不会返回文件名。使用 -L 解决了这个问题。 find 的符号链接选项是 -P -L -H
如果您的 shell 支持 a new globbing option(可以通过:shopt -s globstar
启用),您可以使用:
echo **/*foo*
递归查找任何文件或文件夹。这受到 Bash 4、zsh 和类似 shell 的支持。
我个人已经定义了这个 shell 函数:
f() { find . -name "*$1*"; }
注意:以上行可以直接粘贴到 shell 或添加到用户的 ~/.bashrc
文件中。
然后我可以通过键入以下内容来查找任何文件:
f some_name
或者,您可以使用具有简单语法的 fd
utility,例如 fd pattern
。
shopt -s globstar
命令激活扩展的通配符。这在 Bash、zsh 和类似的 shell 中得到支持。
bash-3.2$ shopt -s globstar
给出 bash: shopt: globstar: invalid shell option name
利用
find path/to/dir -name "*.ext1" -o -name "*.ext2"
解释
第一个参数是要搜索的目录。默认情况下 find 进行递归。 -o 代表 - 或。所以上面的意思是搜索这个通配符或这个。如果您只有一种模式,则不需要 -o。通配符模式周围的引号是必需的。
find <directory_path> -type f -name "<wildcard-match>"
在通配符匹配中,您可以提供您希望匹配的字符串,例如 *.c(适用于所有 c 文件)
find
检测符号 file 链接(但不检测符号 directory 链接中的链接)。 -type f
将导致 find
检测不到符号 file 链接。如果您还想包含指向文件的符号链接,请使用 -L
: find -L <optional_directory_path> -type f
。不要使用 -type f,l
,因为它还会包含符号 目录 链接。
您可以使用:
# find . -type f -name 'text_for_search'
如果您想使用 REGX,请使用 -iname
# find . -type f -iname 'text_for_search'
用于文件搜索 find / -xdev -name settings.xml
-->整台计算机 find ./ -xdev -name settings.xml
-->当前目录 &它的子目录
用于文件扩展类型
find . -type f -name "*.iso"
我很惊讶地发现,当我们要递归时,locate 并没有被大量使用。
我会先定位“$PWD”以获取当前感兴趣的文件夹中的文件列表,然后随意对它们运行 greps。
locate "$PWD" | grep -P <pattern>
当然,这是假设 updatedb 已经完成并且索引会定期更新。这种查找文件的方法比运行查找并要求它沿树向下查找要快得多。为了完整起见,提到这一点。如果树不是很重,没有什么反对使用 find 的。
locate "$PWD*.mp4"
只是提醒您可以跳过 grep
搜索递归文件的默认方式,在大多数情况下可用
find . -name "filepattern"
它从您所在的当前目录开始递归遍历文件名或模式。使用 find 命令,您可以使用通配符和各种开关来查看完整的选项列表,输入
man find
或者如果您的系统上没有手册页
find --help
然而,有更多现代和更快的工具然后找到,它们遍历你的整个文件系统并索引你的文件,一个这样的常用工具是定位或 slocate/mlocate,你应该查看你的操作系统手册以了解如何安装它,一旦它安装它需要启动数据库,如果安装脚本不为你做,可以通过键入手动完成
sudo updatedb
并且,使用它来查找某些特定的文件类型
locate filename
或者,要从当前目录中查找文件名或模式,您可以键入:
pwd | xargs -n 1 -I {} locate "filepattern"
它将查看其文件数据库并快速打印出与您键入的模式匹配的路径名。要查看定位选项的完整列表,请输入:locate --help
或 man locate
此外,您可以配置 locate 以通过 cron 作业在预定时间更新其数据库,因此在凌晨 1 点更新 db 的示例 cron 如下所示:
0 1 * * * updatedb
这些 cron 作业需要由 root 配置,因为 updatedb 需要 root 权限才能遍历整个文件系统。
以下命令将列出当前及其子文件夹中具有确切名称“模式”(例如)的所有文件。
find ./ -name "pattern"
如果要使用通配符搜索特殊文件,可以使用以下代码:
find . -type f -name "*.conf"
假设,您想从这里搜索每个 .conf 文件:
.
表示从此处开始搜索(当前位置)
-type
表示此处为文件 (f) 的搜索项类型。
-name
表示您要使用 *.conf 搜索文件 名称。
下面的命令有助于搜索任何文件 1) 无论情况如何 2) 结果 未经许可排除文件夹 3) 从根目录或您喜欢的路径搜索。使用您喜欢的路径更改 / 。语法:find -iname '' 2>&1 | grep -v "权限被拒绝" 示例
查找 / -iname 'C*.xml' 2>&1 | grep -v "权限被拒绝"
find / -iname '*C*.xml' 2>&1 | grep -v "Permission denied"
find / -iname '*C*.xml' 2>/dev/null
这将搜索当前和子目录中的所有相关文件,分别计算它们的行数以及完全计算它们的行数:
find . -name "*.wanted" | xargs wc -l
如果已安装,请尝试使用 fd
命令。 Install instruction
查找所有以“名称”开头的文件
fd "name*"
此命令忽略所有 .hidden
和 .gitignore
ed 文件。
要包含 .gitignore
ed 文件,请添加 -I
选项,如下所示
fd -I "name*"
要包含隐藏文件,请添加 -H
选项,如下所示
fd -H "name*"
对于 Python>3.5,使用 glob,.
指向您当前的文件夹并查找 .txt
文件:
python -c "import glob;[print(x) for x in glob.glob('./**/*txt', recursive=True)]"
对于旧版本的 Python,您可以安装 glob2
sed
的问题以及使用 awk
和类似内容的公认答案。 ...编程语言。否决答案会花费代表,这不鼓励无缘无故这样做,但如果您仍然认为这是投票欺诈,请阅读 this post。 PS:请使用评论或Stack Overflow Chat进行讨论,它们不属于答案。
不定期副业成功案例分享
find . foo*
,则foo*
将被扩展,然后传递给 find。" "
对于递归搜索是非常必要的。find . -name "foo*" 2>/dev/null