Linux find 命令的 10 种使用方法
该find
命令是最有用的 Linux 命令之一,尤其是当您面对现代计算机上成百上千个文件和文件夹时。顾名思义,它find
可以帮助您查找内容,而不仅仅是通过文件名。
无论您使用的是自己的计算机还是尝试为使用不熟悉系统的某人提供支持,以下 10 种方法find
可以帮助您找到重要数据。
1. 按名称查找单个文件
当您知道文件的名称但不记得将其保存在哪里时,请使用它find
来搜索您的主目录。使用2>/dev/null
它来消除权限错误(或使用它sudo
来获取所有权限)。
$ find / -name "Foo.txt" 2>/dev/null
/home/seth/Documents/Foo.txt
2. 通过近似名称查找单个文件
如果您不记得文件的确切名称,或者不确定是否将任何字符大写,则可以进行部分不区分大小写的搜索,如下所示:
$ find / -iname "*foo*txt" 2>/dev/null
/home/seth/Documents/Foo.txt
/home/seth/Documents/foo.txt
/home/seth/Documents/foobar.txt
3. 查找所有内容
该ls -R
命令以递归方式列出目录的内容,这意味着它不仅列出您为其提供的目标,还会深入到该目标内的每个子目录(以及每个子目录中的每个子目录,等等)。该find
命令也具有该功能,通过以下-ls
选项:
$ find ~/Documents -ls
3554235 0 drwxr-xr-x [...] 05:36 /home/seth/Documents/
3554224 0 -rw-rw-r-- [...] 05:36 /home/seth/Documents/Foo
3766411 0 -rw-rw-r-- [...] 05:36 /home/seth/Documents/Foo/foo.txt
3766416 0 -rw-rw-r-- [...] 05:36 /home/seth/Documents/Foo/foobar.txt
请注意,在此例中我没有使用,因为我只列出了主目录中文件路径2>/dev/null
的内容 ,所以我没有预料到权限错误。
4. 按内容查找
命令find
不必只执行一项任务。事实上, 中的一个选项find
允许您对返回的任何结果执行不同的命令。当您需要按内容而不是按名称find
搜索文件,或者您需要按两者搜索时,这尤其有用。
$ find ~/Documents/ -name "*txt" -exec grep -Hi penguin {} \;
/home/seth/Documents/Foo.txt:I like penguins.
/home/seth/Documents/foo.txt:Penguins are fun.
5. 按类型查找文件
您可以使用该选项显示文件、目录、符号链接、命名管道、套接字等-type
。
$ find ~ -type f
/home/seth/.bash_logout
/home/seth/.bash_profile
/home/seth/.bashrc
/home/seth/.emacs
/home/seth/.local/share/keyrings/login.keyring
/home/seth/.local/share/keyrings/user.keystore
/home/seth/.local/share/gnome-shell/gnome-overrides-migrated
[...]
只要您使用的是 GNU 版本find
,您就可以在搜索结果中包含多种文件类型:
$ find ~ -type f,l -name "notebook*"
/home/seth/notebook.org
/home/seth/Documents/notebook-alias.org
6. 仅列出目录
ls
该命令的一个缺点是无法按文件类型过滤结果,因此如果您只想要路径中的目录列表,则可能会很嘈杂。find
与选项结合使用的命令-type d
是更好的选择:
$ find ~/Public -type d
find ~/Public/ -type d
/home/seth/Public/
/home/seth/Public/example.com
/home/seth/Public/example.com/www
/home/seth/Public/example.com/www/img
/home/seth/Public/example.com/www/font
/home/seth/Public/example.com/www/style
7. 限制列表结果
由于默认用户目录中有数百个文件,而该目录中还有数千个文件,因此有时您会得到find
比您想要的结果更多的结果。您可以使用选项来限制搜索深度,然后输入您想要在起点之后进入的-maxdepth
目录数:find
$ find ~/Public/ -maxdepth 1 -type d
/home/seth/Public/
/home/seth/Public/example.com
8. 查找空文件
有时,发现空文件有助于清理杂乱:
$ find ~ -type f -empty
random.idea.txt
从技术上讲,您可以使用find
删除空文件,但以编程方式删除文件很危险。例如,如果您忘记-type f
在搜索空文件时包含,则结果中会出现目录。通过添加删除标志,您可以删除可能重要的目录结构。
在删除之前编写命令并验证结果至关重要find
。此外,放错位置的删除标志find
可能会在限定结果之前删除结果(换句话说,您可以通过将删除标志放在类型标志之前来删除原本仅用于删除文件的命令中的目录)。
在极少数情况下,当我使用 删除文件时,我更喜欢使用xargs
或Parallel和垃圾命令find
。
9.按年龄查找文件
该-mtime
选项允许您将搜索范围限制为早于某些值的 24 倍的文件,也包括晚于某些值的24 倍的文件。
$ find /var/log -iname "*~" -o -iname "*log*" -mtime +30
数字前面+
的-mtime
并不意味着将该数字添加到时间中。它是一个条件语句,匹配(在此示例中)大于24 乘以 30 的值。换句话说,示例代码查找一个月或更长时间内未修改的日志文件。
要查找过去一周内修改的日志文件,可以使用-
条件:
$ find /var/log -iname "*~" -o -iname "*log*" -mtime -7
/var/log/tallylog
/var/log/cups/error_log
/var/log/cups/access_log
/var/log/cups/page_log
/var/log/anaconda/anaconda.log
/var/log/anaconda/syslog
/var/log/anaconda/X.log
[...]
您已经了解该-ls
标志,因此您可以将其与以下命令结合起来以更清楚:
$ find /var/log -iname "*~" -o -iname "*log*" -mtime -7 -ls
-rw------- 1 root root 0 Jun 9 18:20 /var/log/tallylog
-rw------- 1 root lp 332 Aug 11 15:05 /var/log/cups/error_log
-rw------- 1 root lp 332 Aug 11 15:05 /var/log/cups/access_log
-rw------- 1 root lp 332 Aug 11 15:05 /var/log/cups/page_log
-rw------- 1 root root 53733 Jun 9 18:24 /var/log/anaconda/anaconda.log
-rw------- 1 root root 835513 Jun 9 18:24 /var/log/anaconda/syslog
-rw------- 1 root root 21131 Jun 9 18:24 /var/log/anaconda/X.log
[...]
10. 搜索路径
有时您知道所需文件的目录结构;但您只是不知道目录结构在系统中的位置。要在路径字符串中搜索,您可以使用该-ipath
选项,该选项将点和斜线视为点和斜线,而不是正则表达式字符。
$ find / -type d -name 'img' -ipath "*public_html/example.com*" 2>/dev/null
/home/tux/Public/public_html/example.com/font
找到了
该find
命令是系统管理员必不可少的工具。它在调查或了解新系统、查找放错位置的数据以及解决日常问题时非常有用。但它也只是一个便利工具。
您不需要“好”的理由来使用find
。使用 find
可以更轻松地搜索某些内容,而不必遍历系统。它是一种低调但非常有用的工具,体现了日常 Linux 的极致乐趣。立即开始使用它,并了解是什么让它如此出色。