如何从任何目录中查找文件


22

我正在尝试查找名为Book1的文件。

在我的测试中,我试图查找上述文件,而在此测试中,我不知道该文件位于何处。

我试过了,find / -iname book1但是没有输出。

如果不知道文件在哪里,如何使用命令行找到名为book1的文件?

编辑:

我的方案在下面进行了更详细的描述:

  1. 文件扩展名未知
  2. 确切名称(即大写字母,数字等)未知
  3. 文件的位置未知

2
如果存在一个名为的文件Book1,并且该文件位于您可以读取的目录中,find / -iname book1则将找到该文件。你确定它实际上是Book1和不是Book1.xyz
Fox

文件的完整名称为Book1.gnumeric。您是在说我必须指定文件的全名吗?由于某种原因,我认为对于此特定命令,我只需要文件的通用名称即可。我的测试试图查找文件,例如,如果我不记得文件扩展名,而只是知道我要查找的文件名。请指教。
Aspire27年

@don_crissti完成。请参见上面的编辑。
Aspire27年7

你混合find locatelocate非常慷慨,只要数据库中有匹配的内容,该内容通常就会每天更新一次。find,在这种情况下,它正在寻找文件范围,即您将在中使用的模式ls。你可能是说iname '*book1*'。请注意,该模式必须在引号内,以阻止外壳在find看到它之前展开它。还要注意find,就像许多* nix命令一样,如果不成功,它会令人沮丧地保持沉默。
曼戈

Answers:


31

首先,to的参数-iname是shell 模式。您可以在Bash手册中阅读有关模式的更多信息。要点是,find要真正找到文件,文件名必须与指定的模式匹配。要使不区分大小写的字符串book1匹配,Book1.gnumeric您必须添加*以下内容:

find / -iname 'book1*'

或指定全名:

find / -iname 'Book1.gnumeric'

其次,-inamefind忽略文件名大小写,因此如果您指定-iname book1它也可以找到Book1bOok1等等。如果您确定要查找的文件已被调用,Book1.gnumeric 则不要使用-inamebut -name,它会更快:

find / -name 'Book1.gnumeric'

第三,记住要像其他答案中所说的那样引用模式。

最后-您确定要在系统上的所有位置查找文件 吗?如果您正在处理该文件$HOME或从某个位置下载了该文件,则可能是该文件实际上位于目录中。同样,这可能更快。

编辑

我注意到您编辑了问题。如果您不知道完整的文件名,大写字母和位置,则应该使用以下格式:

find / -iname 'book1*'

我还建议2>/dev/null在该行的末尾隐藏所有*permission denied*和其他错误(如果find以非root用户身份调用将出现):

find / -iname 'book1*' 2>/dev/null

而且,如果您确定要查找的是单个文件,并且系统上只有一个文件符合标准,则可以find在找到第一个匹配文件后告诉退出:

find / -iname 'book1*' -print -quit 2>/dev/null


6

您可以尝试使用该locate命令。它使用文件名数据库来加快搜索速度。

要搜索所有匹配的文件*book1*并忽略大小写,可以使用

locate -i book1

如果要搜索开头的文件,book1则需要自己做通配符:

locate -i 'book1*'

它的速度比快得多find,但仅是最新的数据库刷新时间。


5

如果您知道有一个名为book1.something的文件,则该文件的位置,的确切值something和文件名的大写字母都未知:

find / -iname 'book1.*'

如果您确定只知道文件名包含单词book,则可以使用以下命令生成可能更大的列表

find / -iname '*book*'

to的参数-name是shell glob模式。从文件所在的目录中进行比较:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

这代表由执行的搜索-name。该-iname选项仅允许使用不区分大小写的版本。


1

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

将报告名称中包含的所有文件的路径book1(与案件的任何变化,只是考虑到ASCII拉丁字符bokBOK,而不是许多其他变化的Unicode一样𝗄𝚔𝘬和他们所有的变化与变音符号...)中您具有读取权限的所有目录。


0

对于这些任务,我总是做: find / -iregex '.*Book1.*'

这种形式将处理场景的3点(这iregex是一个不区分大小写的有理表达式,并且.*两侧的模式都将与您固定的Book1模式前后的任何字符匹配-显然,这可能给您带来不必要的更多结果)但您一定不要错过该文件)

主要的区别:如果可能的话,会比只使用更加严格/,像只试图/home左右,否则你会在一些目录不相关的下降(/sys/dev,等...)

但是请记住,Unix权限适用:如果文件位于运行find命令的用户没有访问(执行)权限的目录中,find将无法在其中找到该文件。


iregex在Solaris(未指定OS)(可能未指定* BSD)等地方无法使用,它是GNU扩展,不是标准的find
Gert van den Berg

0

Silver Searcher是一种非常便捷的工具,用于搜索文件和内容。

为了解决您的问题,silver searcher命令如下所示:

ag -g Book1

-g PATTERN 打印匹配PATTERN的文件名


0

locate 及其变体往往是一种快速的方法。

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

如果定位不可用,则可以find改用。它往往要慢得多,但也要精确得多。

如果您只有一个分区:(如果您的用户可能无权访问该文件,请以root身份运行)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

如果您不包括-xdev find搜索其他分区上的内容(例如/proc和)/sys,则这些内容容易在屏幕上显示错误,特别是如果您不是root用户。(可以通过2> /dev/null在find命令的末尾附加错误来隐藏错误(应删除注释))

如果您有多个分区,并且不知道文件位于哪个分区上,则可以获取一个列表lsblk(在基于Linux的操作系统上,df否则可以选择解析输出),并将其输入到find中:不知道您是否可以访问该文件)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(如果您的任何安装点中都有空格,这将有些脆弱)(df参数可能需要调整。-P使GNU df提供标准的POSIX输出。其他版本可能具有其他参数或需要省略。请阅读手册页)

grep -F排除了其他的东西回来,像交换分区。

在非GNU版本中,awk会找到以mount开头的设备,/dev以获取实际的文件系统,然后从df输出中打印最后一个字段(mountpoint)。

这也假定使用类似bourne的shell(ksh并且bash应该可以使用。如果您使用的是csh变体,请在尝试之前启动一个可编写脚本的shell


grepS可能会发生是有点吵,学习如何对其进行过滤, 更好的(这不应该需要用的例子,但如果是一些更常见的是寻找,在里grep需要调整,以保持噪音水平下)
格特范登伯格

0

ag(银色搜索器)在文件中提供了非常快速的搜索,还提供了搜索文件名的选项:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

因此,在我的用例中,如果文件不是由ag忽略的文件,它的速度要快30倍以上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.