标签 Find 下的文章

学习 find 命令的原因有很多。

不管我决心如何组织文件,似乎总有无法找到文件的时候。有时是因为我不记得最初的文件名,其他时候,我知道名字,但我不记得在哪里保存它了。甚至有时我需要一个我最初就没有创建的文件。但是,无论遇到什么困难,我知道在 POSIX 系统 上,总是有 find 命令可以帮助我。

安装 find

find 命令由 POSIX 规范 定义,它创建了一个用于衡量 POSIX 系统的开放标准,这包括 Linux、BSD 和 macOS。简而言之,只要你运行的是 Linux、BSD 或 macOS,那么 find 已经安装了。

但是,并非所有的 find 命令都完全相同。例如,GNU 的 find 命令有一些 BSD、Busybox 或 Solaris 上 find 命令可能没有或有但实现方式不同的功能。本文使用 findutils 包中的 GNU find,因为它很容易获得且非常流行。本文演示的大多数命令都适用于 find 的其他实现,但是如果你在 Linux 以外的平台上尝试命令并得到非预期结果,尝试下载并安装 GNU 版本。

按名称查找文件

你可以借助正则表达式使用完整或部分的文件名来定位文件。find 命令需要你给出想搜索的目录;指定搜索属性选项,例如,-name 用于指定区分大小写的文件名;然后是搜索字符串。默认情况下,搜索字符串按字面意思处理:除非你使用正则表达式语法,否则 find 命令搜索的文件名正是你在引号之间输入的字符串。

假设你的 Documents 目录包含四个文件:Foofoofoobar.txtfoo.xml。以下是对 foo 的字面搜索:

$ find ~ -name "foo"
/home/tux/Documents/examples/foo

你可以使用 -iname 选项使其不区分大小写来扩大搜索范围:

$ find ~ -iname "foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

通配符

你可以使用基本的 shell 通配符来扩展搜索。例如,* 表示任意数量的字符:

$ find ~ -iname "foo*"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

? 表示单个字符:

$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

这不是正则表达式语法,因此 . 在示例中只表示字母“点”。

正则表达式

你还可以使用正则表达式。与 -iname-name 一样,也有区分大小写和不区分大小写的选项。但不一样的是,-regex-iregex 搜索应用于整个路径,而不仅仅是文件名。这意味着,如果你搜索 foo,你不会得到任何结果,因为 foo/home/tux/Documents/foo 不匹配。相反,你必须要么搜索整个路径,要么在字符串的开头使用通配符:

$ find ~ -iregex ".*foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo

查找近一周修改过的文件

要查找近一周修改的文件,使用 -mtime 选项以及过去的天数(负数):

$ find ~ -mtime -7
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt

查找近几天修改的文件

你可以结合使用 -mtime 选项来查找近几天范围内修改的文件。对于第一个 -mtime 参数,表示上一次修改文件的最近天数。第二个参数表示最大天数。例如,搜索修改时间超过 1 天但不超过 7 天的文件:

$ find ~ -mtime +1 -mtime -7

按文件类型限制搜索

指定查找文件的类型来优化 find 的结果是很常见的。如果你不确定要查找的内容,则不应该使用此选项。但如果你知道要查找的是文件而不是目录,或者是目录而不是文件,那么这可能是一个很好的过滤器。选项是 -type,它的参数是代表不同类型数据的字母代码。最常见的是:

  • d - 目录
  • f - 文件
  • l - 链接文件
  • s - 套接字
  • p - 命名管道(用于 FIFO)
  • b - 块设备(通常是硬盘)

下面是一些例子:

$ find ~ -type d -name "Doc*"
/home/tux/Documents
$ find ~ -type f -name "Doc*"
/home/tux/Downloads/10th-Doctor.gif
$ find /dev -type b -name "sda*"
/dev/sda
/dev/sda1

调整范围

find 命令默认是递归的,这意味着它会在指定的目录中层层搜索结果。这在大型文件系统中可能会变得不堪重负,但你可以使用 -maxdepth 选项来控制搜索深度:

$ find /usr -iname "*xml" | wc -l
15588
$ find /usr -maxdepth 2 -iname "*xml" | wc -l
15

也可以使用 -mindepth 设置最小递归深度:

$ find /usr -mindepth 8 -iname "*xml" | wc -l
9255

下载速查表

本文仅介绍 find 的基本功能,它是一个很好的搜索工具,但对于强大的 Parallel 命令来说,它也是一个非常有用的前端。学习 find 的原因有很多,所以 下载我们免费的 find 速查表 吧,它可以帮助你了解有关该命令的更多信息。


via: https://opensource.com/article/21/9/linux-find-command

作者:Seth Kenlon 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

fd 命令是一个流行的、用户友好的 find 命令的替代品。

 title=

许多 Linux 程序员在其工作中每天都在使用 find 命令。但是 find 给出的文件系统条目是有限的,如果你要进行大量的 find 操作,它甚至不是很快速。因此,我更喜欢使用 Rust 编写的 fd 命令,因为它提供了合理的默认值,适用于大多数使用情况。

正如它的 README 所说,“fd 是一个在文件系统中寻找条目的程序。它是一个简单、快速和用户友好的 find 的替代品。”它的特点是目录的并行遍历,可以一次搜索多个目录。它支持正则表达式(regex)和基于通配符的模式。

安装 fd

在 Linux 上,你可以从你的软件库中安装 fd(可用的软件包列表可以在 Repology 上的 fd 页面 找到)。 例如,在 Fedora 上:

$ sudo dnf install fd-find

在 macOS 上,可以使用 MacPortsHomebrew

另外,你也可以使用 Rust 的 Cargo 软件包管理器:

$ cargo install fd-find

使用 fd

要做一个简单的搜索,运行 fd 并在后面跟上要搜索的名字,例如:

$ fd sh
registry/src/github.com-1ecc6299db9ec823/cc-1.0.67/src/bin/gcc-shim.rs
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.bash
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.fish
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.zsh
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/xtests/run.sh
registry/src/github.com-1ecc6299db9ec823/git2-0.13.18/src/stash.rs
registry/src/github.com-1ecc6299db9ec823/libc-0.2.94/src/unix/solarish
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/cmake/SelectHashes.cmake
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/include/git2/stash.h
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/include/git2/sys/hashsig.h
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/backport.sh
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/leaks.sh
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/valgrind.sh
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/src/config_snapshot.c
[...]

如果你想搜索一个特定的目录,可以将目录路径作为 fd 的第二个参数,例如:

$ fd passwd /etc
/etc/pam.d/passwd
/etc/passwd
/etc/passwd-
/etc/security/opasswd

要搜索一个特定的文件扩展名,使用 -e 作为选项。例如:

$ fd . '/home/ssur/exa' -e md
/home/ssur/exa/README.md
/home/ssur/exa/devtools/README.md
/home/ssur/exa/man/exa.1.md
/home/ssur/exa/man/exa_colors.5.md
/home/ssur/exa/xtests/README.md
$

你也可以通过提供 -x-X 来执行一个命令。

  • -x/--exec:选项为每个搜索结果(并行)运行一个外部命令。
  • -X/--exec-batch:选项将所有搜索结果作为参数启动一次外部命令。

例如,要递归地找到所有的 ZIP 档案并解压:

$ fd -e zip -x unzip

或者,要列出某个特定目录下在过去 n 天内改变的所有文件,使用--changed-within 选项:

$ fd . '/home/ssur/Work/' --changed-within 10d
/home/ssur/Work/wildfly/connector/src/main/java/org/jboss/as/connector/subsystems/data_sources/JdbcDriverAdd.java
/home/ssur/Work/wildfly/connector/src/main/java/org/jboss/as/connector/subsystems/data_sources/JdbcExample.java
[...]

而要搜索所有在特定天数之前被修改的文件,请使用 --changed-before n 选项:

$ fd . '/home/ssur/Work/' --changed-before 365d

这里,. 作为一个(正则)通配符,指示 fd 返回所有文件。

要了解更多关于 fd 的功能,请查阅 GitHub 上的 文档

总结

我特别喜欢 fd 的一点是,搜索模式默认是不区分大小写的,这使得它更容易找到东西,即使你对你要找的东西没有精确的认识。更好的是,如果模式包含一个大写的字符,它就会自动切换到大小写敏感。

另一个好处是,它使用颜色编码来突出不同的文件类型。

如果你已经在使用这个神奇的 Rust 工具,请在评论中告诉我们你的想法。


via: https://opensource.com/article/21/6/fd-linux

作者:Sudeshna Sur 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

find 命令有巨多的选项可以帮助你准确定位你在 Linux 系统上需要寻找的文件。这篇文章讨论了一系列非常有用的选项。

在 Linux 系统上有许多用于查找文件的命令,而你在使用它们时也有巨多的选项可以使用。

例如,你不仅可以通过文件的名称来查找文件,还可以通过文件的所有者或者组、它们的创建时间、大小、分配的权限、最后一次访问它们的时间、关联的信息节点,甚至是文件是否属于系统上不再存在的帐户或组等等来查找文件。

你还可以指定搜索从哪里开始,搜索应该深入到文件系统的什么位置,以及搜索结果将告诉你它所找到的文件的数量。

而所有这些要求都可以通过 find 命令来处理。

下面提供了根据这些要求查找文件的示例。在某些命令中,错误(例如试图列出你没有读取权限的文件)输出将被发送到 /dev/null,以便我们不必查看它。或者,我们可以简单地以 root 身份运行以避免这个问题。

请记住,还有更多的其他选项。这篇文章涵盖了很多内容,但并不是 find 命令帮助你定位查找文件的所有方式。

选择起点

使用 find,你可以选择一个起点或从你所在的位置开始。要选择的搜索的起点,请在单词 find 后输入它。例如,find /usrfind ./bin 将在 /usr 目录或当前位置下的 bin 目录开始搜索,而 find ~ 将在你的主目录中开始搜索,即使你当前位于当前文件系统中的其他位置。

选择你要找的

最常用的搜索策略之一是按名称搜索文件。这需要使用 -name 选项。

默认情况下,find 会显示找到的文件的完整路径。如果你在命令中添加 -print,你会看到同样的结果。如果你想查看与文件相关的详细信息—-例如:文件的长度、权限等,你需要在你的 find 命令的末尾添加 -ls 参数。

$ find ~/bin -name tryme
/home/shs/bin/tryme
$ find ~/bin -name tryme -print
/home/shs/bin/tryme
$ find ~/bin -name tryme -ls
   917528   4 -rwx------   1 shs    shs   139 Apr  8  2019 /home/shs/bin/tryme

你也可以使用子字符串来查找文件。例如,如果你将上面示例中的 tryme 替换为 try*,你将会找到所有名称以 try 开头的文件。(LCTT 译注:如果要使用通配符 * ,请将搜索字符串放到单引号或双引号内,以避免通配符被 shell 所解释)

按名称查找文件可能是 find 命令最典型的用法,不过还有很多其他的方式来查找文件,并且有这样做的需要。下面的部分展示了如何使用其他可用的方式。

此外,当按文件大小、组、索引节点等条件来搜索文件时,你需要确认找到的文件与你要查找的文件是否相匹配。使用 -ls 选项来显示细节是非常有用。

通过大小查找文件

按大小查找文件需要使用 -size 选项并且对相应规范使用一点技巧。例如,如果你指定 -size 189b,你将找到 189 个块大小的文件,而不是 189 个字节。(LCTT 译注:如果不跟上单位,默认单位是 b。一个块是 512 个字节大小,不足或正好 512 个字节将占据一个块。)对于字节,你需要使用 --size 189c(字符)。而且,如果你指定 --size 200w ,你将会找到 200 个“ word ”的文件——以“双字节增量”为单位的字,而不是“我们互相谈论的那些事情”中的单词。你还可以通过以千字节(k)、兆字节(M)和千兆字节(G)为单位提供大小来查找文件。(LCTT 译注:乃至还有 TP

大多数情况下,Linux 用户会搜索比选定大小要大的文件。例如,要查找大于 1 千兆字节的文件,你可以使用这样的命令,其中 +1G 表示“大于 1 千兆字节”:

$ find -size +1G -ls 2>/dev/null
  787715 1053976 -rw-rw-r-- 1 shs  shs  1079263432 Dec 21  2018 ./backup.zip
  801834 1052556 -rw-rw-r-- 1 shs  shs  1077809525 Dec 21  2018 ./2019/hold.zip

通过索引节点号查找文件

你可以通过用于维护文件元数据(即除文件内容和文件名之外的所有内容)的索引节点来查找文件。

$ find -inum 919674 -ls 2>/dev/null
  919674  4 -rw-rw-r--  1 shs  shs   512 Dec 27 15:25 ./bin/my.log

查找具有特定文件所有者或组的文件

按所有者或组查找文件也非常简单。这里我们使用 sudo 来解决权限问题。

$ sudo find /home -user nemo -name "*.png" -ls
 1705219  4 drwxr-xr-x  2 nemo nemo  4096 Jan 28 08:50 /home/nemo/Pictures/me.png

在下面这个命令中,我们寻找一个被称为 admins 的多用户组拥有的文件。

# find /tmp -group admins -ls
   262199      4 -rwxr-x---   1 dory     admins         27 Feb 16 18:57 /tmp/testscript

查找没有所有者或组的文件

你可以使用如下命令所示的 -nouser 选项来查找不属于当前系统上的任何用户的文件。

# find /tmp -nouser -ls
262204 4 -rwx------ 1 1016 1016 17 Feb 17 16:42 /tmp/hello

请注意,该列表显示了旧用户的 UID 和 GID,这清楚地表明该用户未在系统上定义。这种命令将查找帐户已从系统中删除的用户创建在主目录之外的文件,或者在用户帐户被删除后而未被删除的主目录中创建的文件。类似地,-nogroup 选项也会找到这样的文件,尤其是当这些用户是相关组的唯一成员时。

按上次更新时间查找文件

在此命令中,我们在特定用户的主目录中查找过去 24 小时内更新过的文件。sudo 用于搜索另一个用户的主目录。

$ sudo find /home/nemo -mtime -1
/home/nemo
/home/nemo/snap/cheat
/home/nemo/tryme

按上次更改权限的时间查找文件

-ctime 选项可以帮助你查找在某个参考时间范围内状态(如权限)发生更改的文件。以下是查找在最后一天内权限发生更改的文件的示例:

$ find . -ctime -1 -ls
   787987   4 -rwxr-xr-x   1 shs   shs     189 Feb 11 07:31 ./tryme

请记住,显示的日期和时间只反映了对文件内容进行的最后更新。你需要使用像 stat 这样的命令来查看与文件相关联的三个状态(文件创建、修改和状态更改)。

按上次访问的时间查找文件

在这个命令中,我们使用 -atime 选项查找在过去两天内访问过的本地 pdf 文件。

$ find -name "*.pdf" -atime -2
./Wingding_Invites.pdf

根据文件相对于另一个文件的时间来查找文件

你可以使用 -newer 选项来查找比其他文件更新的文件。

$ find . -newer dig1 -ls
   786434     68 drwxr-xr-x  67 shs      shs         69632 Feb 16 19:05 .
  1064442      4 drwxr-xr-x   5 shs      shs          4096 Feb 16 11:06 ./snap/cheat
   791846      4 -rw-rw-r--   1 shs      shs           649 Feb 13 14:26 ./dig

没有相应的 -older 选项,但是你可以用 ! -newer (即更旧)得到类似的结果,它们基本上一样。

按类型查找文件

通过文件类型找到一个文件,你有很多选项——常规文件、目录、块和字符文件等等。以下是文件类型选项列表:

b      块特殊文件(缓冲的)
c      字符特殊文件(无缓冲的)
d      目录
p      命名管道(FIFO)
f      常规文件
l      符号链接
s      套接字

这里有一个寻找符号链接的例子:

$ find . -type l -ls
   805717   0 lrwxrwxrwx   1 shs    shs    11 Apr 10  2019 ./volcano -> volcano.pdf
   918552   0 lrwxrwxrwx   1 shs    shs     1 Jun 16  2018 ./letter -> pers/letter2mom

限制查找的深度

-mindepth-maxdepth 选项控制在文件系统中搜索的深度(从当前位置或起始点开始)。

$ find -maxdepth 3 -name "*loop"
./bin/save/oldloop
./bin/long-loop
./private/loop

查找空文件

在这个命令中,我们寻找空文件,但不进入目录及其子目录。

$ find . -maxdepth 2 -empty -type f -ls
   917517      0 -rw-rw-r--   1 shs   shs      0 Sep 23 11:00 ./complaints/newfile
   792050      0 -rw-rw-r--   1 shs   shs      0 Oct  4 19:02 ./junk

按权限查找文件

你可以使用 -perm 选项查找具有特定权限集的文件。在下面的示例中,我们只查找常规文件(-type f),以避免看到符号链接,默认情况下符号链接被赋予了这种权限,即使它们所引用的文件是受限的。

$ find -perm 777 -type f -ls
find: ‘./.dbus’: Permission denied
   798748      4 -rwxrwxrwx   1 shs      shs            15 Mar 28  2019 ./runme

使用查找来帮助你删除文件

如果使用如下命令,你可以使用 find 命令定位并删除文件:

$ find . -name runme -exec rm {} \;

{} 代表根据搜索条件找到的每个文件的名称。

一个非常有用的选项是将 -exec 替换为 -ok。当你这样做时,find 会在删除任何文件之前要求确认。

$ find . -name runme -ok rm -rf {} \;
< rm ... ./bin/runme > ?

删除文件并不是 -ok-exec 能为你做的唯一事情。例如,你可以复制、重命名或移动文件。

确实有很多选择可以有效地使用 find 命令,毫无疑问还有一些在本文中没有涉及到。我希望你已经找到一些新的,特别有帮助的。


via: https://www.networkworld.com/article/3527420/how-to-find-what-you-re-looking-for-on-linux-with-find.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:heguangzhi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

find 是日常工具箱中功能强大、灵活的命令行程序之一。它如它名字所暗示的:查找符合你指定条件的文件和目录。借助 -exec-delete 之类的参数,你可以让它对找到的文件进行操作。

命令行提示系列的这一期中,你将会看到 find 命令的介绍,并学习如何使用内置命令或使用 xargs 命令处理文件。

查找文件

find 至少要加上查找的路径。例如,此命令将查找(并打印)系统上的每个文件:

find /

由于一切皆文件,因此你会看到大量的输出。这可能无法帮助你找到所需的内容。你可以更改路径参数缩小范围,但这实际上并没有比使用 ls 命令更好。因此,你需要考虑要查找的内容。

也许你想在家目录中查找所有 JPEG 文件。 -name 参数允许你将结果限制为与给定模式匹配的文件。

find ~ -name '*jpg'

但是等等!如果其中一些扩展名是大写怎么办? -iname 类似于 -name,但不区分大小写:

find ~ -iname '*jpg'

很好!但是 8.3 命名方案出自 1985 年。某些图片的扩展名可能是 .jpeg。幸运的是,我们可以将模式使用“或”(-o)进行组合。括号需要转义,以便使 find 命令而不是 shell 程序尝试解释它们。

find ~ \( -iname 'jpeg' -o -iname 'jpg' \)

更进一步。如果你有一些以 jpg 结尾的目录怎么办?(我不懂你为什么将目录命名为 bucketofjpg 而不是 pictures?)我们可以加上 -type 参数来仅查找文件:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f

或者,也许你想找到那些名字奇怪的目录,以便之后可以重命名它们:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d

最近你拍摄了很多照片,因此使用 -mtime(修改时间)将范围缩小到最近一周修改过的文件。 -7 表示 7 天或更短时间内修改的所有文件。

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7

使用 xargs 进行操作

xargs 命令从标准输入流中获取参数,并基于它们执行命令。继续使用上一节中的示例,假设你要将上周修改过的家目录中的所有 JPEG 文件复制到 U 盘,以便插到电子相册上。假设你已经将 U 盘挂载到 /media/photo_display

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7 -print0 | xargs -0 cp -t /media/photo_display

这里的 find 命令与以前的版本略有不同。-print0 命令让输出有一些更改:它不使用换行符,而是添加了一个 null 字符。xargs-0(零)选项可调整解析以达到预期效果。这很重要,不然对包含空格、引号或其他特殊字符的文件名执行操作可能无法按预期进行。对文件采取任何操作时,都应使用这些选项。

cp 命令的 -t 参数很重要,因为 cp 通常要求目的地址在最后。你可以不使用 xargs 而使用 find-exec 执行此操作,但是 xargs 的方式会更快,尤其是对于大量文件,因为它会单次调用 cp

了解更多

这篇文章仅仅是 find 可以做的事情的表面。 find 支持基于权限、所有者、访问时间等的测试。它甚至可以将搜索路径中的文件与其他文件进行比较。将测试与布尔逻辑相结合,可以为你提供惊人的灵活性,以精确地找到你要查找的文件。使用内置命令或管道传递给 xargs,你可以快速处理大量文件。


via: https://fedoramagazine.org/command-line-quick-tips-locate-and-process-files-with-find-and-xargs/

作者:Ben Cotton 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 管理员一天都不能离开搜索文件,因为这是他们的日常活动。了解一些搜索的东西是不错的,因为这能帮助你在命令行服务器中工作。这些命令记忆起来不复杂,因为它们使用的是标准语法。

可以通过四个 Linux 命令啦执行此操作,每个命令都有自己独特的功能。

方法 1:使用 find 命令在 Linux 中搜索文件和文件夹

find 命令被广泛使用,并且是在 Linux 中搜索文件和文件夹的著名命令。它搜索当前目录中的给定文件,并根据搜索条件递归遍历其子目录。

它允许用户根据大小、名称、所有者、组、类型、权限、日期和其他条件执行所有类型的文件搜索。

运行以下命令以在系统中查找给定文件。

# find / -iname "sshd_config"
/etc/ssh/sshd_config

运行以下命令以查找系统中的给定文件夹。要在 Linux 中搜索文件夹,我们需要使用 -type 参数。

# find / -type d -iname "ssh"
/usr/lib/ssh
/usr/lib/go/src/cmd/vendor/golang.org/x/crypto/ssh
/usr/lib/go/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ssh
/etc/ssh

使用通配符搜索系统上的所有文件。我们将搜索系统中所有以 .config 为扩展名的文件。

# find / -name "*.config"
/usr/lib/mono/gac/avahi-sharp/1.0.0.0__4d116c78973743f5/avahi-sharp.dll.config
/usr/lib/mono/gac/avahi-ui-sharp/0.0.0.0__4d116c78973743f5/avahi-ui-sharp.dll.config
/usr/lib/python2.7/config/Setup.config
/usr/share/git/mw-to-git/t/test.config
/var/lib/lightdm/.config
/home/daygeek/.config
/root/.config
/etc/skel/.config

使用以下命令格式在系统中查找空文件和文件夹。

# find / -empty

使用以下命令组合查找 Linux 上包含特定文本的所有文件。

# find / -type f -exec grep "Port 22" '{}' \; -print
# find / -type f -print | xargs grep "Port 22"
# find / -type f | xargs grep 'Port 22'
# find / -type f -exec grep -H 'Port 22' {} \;

方法 2:使用 locate 命令在 Linux 中搜索文件和文件夹

locate 命令比 find 命令运行得更快,因为它使用 updatedb 数据库,而 find 命令在真实系统中搜索。

它使用数据库而不是搜索单个目录路径来获取给定文件。

locate 命令未在大多数发行版中预安装,因此,请使用你的包管理器进行安装。

数据库通过 cron 任务定期更新,但我们可以通过运行以下命令手动更新它。

$ sudo updatedb

只需运行以下命令即可列出给定的文件或文件夹。在 locate 命令中不需要指定特定选项来打印文件或文件夹。

在系统中搜索 ssh 文件夹。

# locate --basename '\ssh'
/etc/ssh
/usr/bin/ssh
/usr/lib/ssh
/usr/lib/go/pkg/linux_amd64/cmd/vendor/golang.org/x/crypto/ssh
/usr/lib/go/src/cmd/go/testdata/failssh/ssh
/usr/lib/go/src/cmd/vendor/golang.org/x/crypto/ssh

在系统中搜索 ssh_config 文件。

# locate --basename '\sshd_config'
/etc/ssh/sshd_config

方法 3:在 Linux 中搜索文件使用 which 命令

which 返回在终端输入命令时执行的可执行文件的完整路径。

当你想要为可执行文件创建桌面快捷方式或符号链接时,它非常有用。

which 命令搜索当前用户而不是所有用户的 $PATH 环境变量中列出的目录。我的意思是,当你登录自己的帐户时,你无法搜索 root 用户文件或目录。

运行以下命令以打印 vim 可执行文件的完整路径。

# which vi
/usr/bin/vi

或者,它允许用户一次执行多个文件搜索。

# which -a vi sudo
/usr/bin/vi
/bin/vi
/usr/bin/sudo
/bin/sudo

方法 4:使用 whereis 命令在 Linux 中搜索文件

whereis 命令用于搜索给定命令的二进制、源码和手册页文件。

# whereis vi
vi: /usr/bin/vi /usr/share/man/man1/vi.1p.gz /usr/share/man/man1/vi.1.gz

via: https://www.2daygeek.com/four-easy-ways-to-search-or-find-files-and-folders-in-linux/

作者:Prakash Subramanian 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

fd 命令提供了一种简单直白的搜索 Linux 文件系统的方式。

fd 是一个超快的,基于 Rust 的 Unix/Linux find 命令的替代品。它不提供所有 find 的强大功能。但是,它确实提供了足够的功能来覆盖你可能遇到的 80% 的情况。诸如良好的规划和方便的语法、彩色输出、智能大小写、正则表达式以及并行命令执行等特性使 fd 成为一个非常有能力的后继者。

安装

进入 fd GitHub 页面,查看安装部分。它涵盖了如何在macOSDebian/Ubuntu Red HatArch Linux 上安装程序。安装完成后,你可以通过运行帮助来获得所有可用命令行选项的完整概述,通过 fd -h 获取简明帮助,或者通过 fd --help 获取更详细的帮助。

简单搜索

fd 旨在帮助你轻松找到文件系统中的文件和文件夹。你可以用 fd 带上一个参数执行最简单的搜索,该参数就是你要搜索的任何东西。例如,假设你想要找一个 Markdown 文档,其中包含单词 services 作为文件名的一部分:

$ fd services
downloads/services.md

如果仅带一个参数调用,那么 fd 递归地搜索当前目录以查找与莫的参数匹配的任何文件和/或目录。使用内置的 find 命令的等效搜索如下所示:

$ find . -name 'services'
downloads/services.md

如你所见,fd 要简单得多,并需要更少的输入。在我心中用更少的输入做更多的事情总是对的。

文件和文件夹

您可以使用 -t 参数将搜索范围限制为文件或目录,后面跟着代表你要搜索的内容的字母。例如,要查找当前目录中文件名中包含 services 的所有文件,可以使用:

$ fd -tf services
downloads/services.md

以及,找到当前目录中文件名中包含 services 的所有目录:

$ fd -td services
applications/services
library/services

如何在当前文件夹中列出所有带 .md 扩展名的文档?

$ fd .md
administration/administration.md
development/elixir/elixir_install.md
readme.md
sidebar.md
linux.md

从输出中可以看到,fd 不仅可以找到并列出当前文件夹中的文件,还可以在子文件夹中找到文件。很简单。

你甚至可以使用 -H 参数来搜索隐藏文件:

fd -H sessions .
.bash_sessions

指定目录

如果你想搜索一个特定的目录,这个目录的名字可以作为第二个参数传给 fd

$ fd passwd /etc
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd

在这个例子中,我们告诉 fd 我们要在 etc 目录中搜索 passwd 这个单词的所有实例。

全局搜索

如果你知道文件名的一部分,但不知道文件夹怎么办?假设你下载了一本关于 Linux 网络管理的书,但你不知道它的保存位置。没有问题:

fd Administration /
/Users/pmullins/Documents/Books/Linux/Mastering Linux Network Administration.epub

总结

fdfind 命令的极好的替代品,我相信你会和我一样发现它很有用。要了解该命令的更多信息,只需浏览手册页。


via: https://opensource.com/article/18/6/friendly-alternative-find

作者:Patrick H. Mullins 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出