使用命令行按名称查找文件


182

我想使用命令行来确定文件的位置。我努力了:

find . -type f -name "postgis-2.0.0"

locate postgis-2.0.0

无济于事。提供文件名的命令是什么以确定文件的目录?


2
locate命令很好,只需使用命令首先更新locatedbupdatedb
thucnguyen

如果已经安装,则可能不再有新文件名postgis-2.0.0。通常在通过程序包管理器安装后,可执行文件将位于其中一个$PATH文件夹中,请尝试which postgis查看位置。如果未返回任何内容,则只有您应该手动查找文件位置。
sdkks 2016年

Answers:


231

试试吧find ~/ -type f -name "postgis-2.0.0"

使用.将仅搜索当前目录。 ~/将搜索整个主目录(可能是您下载到的主目录)。如果您wget以root用户身份使用,则可能在其他地方,因此可以使用/它搜索整个文件系统。

祝好运


1
哦,我曾经wget是root,所以/工作了,谢谢
Sam007

有关更多信息,请检查此链接help.ubuntu.com/community/find
habibun

我发现:/ Users / UserName // Library / Saved Application State / com.bitrock.appinstaller.savedState:权限被拒绝错误。它出现在命令的每次执行中。如何摆脱它?
爱德华

29

我会尝试:

sudo find / -type d -name "postgis-2.0.0"

的。表示仅在当前目录中搜索,如果您真的不知道,最好从root搜索所有内容。同样,键入-f表示搜索文件,而不是文件夹。添加后sudo,它可以搜索所有文件夹/子文件夹。

您的语法locate正确,但是您可能必须运行

sudo updatedb

第一。不管出于什么原因,我都没有好运locate

locate使用由制作的文件和目录数据库updatedb。因此,如果您下载了新文件,则很有可能updatedb尚未更新文件和目录的数据库。您可以sudo updatedb在使用locate实用程序之前使用。 updatedb通常在Linux系统上每天单独运行一次。


14

find是最有用的Linux / Unix工具之一。

尝试 find . -type d | grep DIRNAME


使用grep over -name有什么好处吗?
TryHarder'2

@oooooo我在下面的回答中添加了一个原因
zanbri '16

find plus grep是唯一对我
有用的

12

其他答案很好,但是我发现省略Permission denied语句可以使我得到更清晰的答案(stderr由于未运行,省略了sudo):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null

哪里:

  • / 可以替换为您要从其开始搜索的目录
  • fd如果要搜索目录而不是文件,可以替换为
  • -iname-name如果您希望搜索区分大小写,则可以替换为
  • *如果您不希望在搜索中使用通配符,则可以省略搜索项中的s

一种替代方法是:

find / -type f 2>/dev/null | grep "postgis-2.0.0"

如果搜索字词与完整文件路径中的任意位置匹配,则这种方式将返回结果 /home/postgis-2.0.0/docs/Readme.txt


2
-regex和用-iregex进行搜索的开关Regular Expressions,它们也可以找到提及的路径。建议查找文件(-type f)的任何项目,这样会浪费grep更多资源。Permission denied如果用户无权访问文件或文件夹,则在使用sudofind之前使用将允许find查看所有文件。
sdkks 2016年

1
很高兴了解正则表达式开关,谢谢。
zanbri '16

@zanbri使用-wholename-iwholename代替管道grep
wjandrea

4

尝试 find . -name "*file_name*"

  • 您可以在其中将“。”(查看当前目录)更改为“ /”(查看整个系统)或“〜/”(查看主目录)。

  • 如果您不希望区分大小写,可以在其中将“ -name”更改为“ -iname”。

  • 您可以在其中将“ file_name ”(可以以任何形式开头和结尾的文件)更改为文件的确切名称。


3

这应该简化文件的定位:

这将为您提供文件的完整路径

tree -f  / | grep postgis-2.0.0

树以树状格式列出目录的内容。在-f讲述树给出完整的文件路径。由于我们不知道它的位置或父位置,因此最好从文件系统根/向下递归搜索。然后,我们将输出发送到grep以突出显示我们的单词,postgis-2.0.0


0

尽管find命令是递归遍历目录树的最简单方法,但还有其他方法,特别是默认情况下,Ubuntu附带的两种脚本语言已经可以做到这一点。

重击

bash 有一个非常不错的globstarshell选项,它允许递归遍历目录树。我们需要做的只是测试./**/*扩展中的项目是否为文件以及是否包含所需的文本:

bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done 
./testdir/texts/postgis-2.0.0

佩尔

Perl具有Find模块,该模块允许执行目录树的递归遍历,并通过子例程对其执行特定操作。使用一个小的脚本,您可以遍历目录树,将包含所需字符串的文件推入数组,然后按如下所示进行打印:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;

my @wanted_files;
find(
     sub{ 
         -f $_ && $_ =~ $ARGV[0]  
               && push @wanted_files,$File::Find::name
     }, "."
);

foreach(@wanted_files){
    print "$_\n"
}

以及它是如何工作的:

$ ./find_file.pl  "postgis-2.0.0"                                                       
./testdir/texts/postgis-2.0.0

蟒蛇

Python是另一种脚本语言,在Ubuntu世界中使用非常广泛。特别是,它具有os.walk()允许我们执行与上述相同的操作的模块-遍历目录树并获取包含所需字符串的文件列表。

作为单行代码,可以这样做:

$ python -c 'import os;print([os.path.join(r,i) for r,s,f in os.walk(".") for i in f if "postgis-2.0.0" in i])'                                                                         
['./testdir/texts/postgis-2.0.0']

完整脚本如下所示:

#!/usr/bin/env python
import os;

for r,s,f in os.walk("."):
    for i in f:
        if "postgis-2.0.0" in i:
            print(os.path.join(r,i))

0

$ find . -type f | grep IMG_20171225_*

./03-05--2018/IMG_20171225_200513.jpg
在命令find将要说明起点之后 给出DOT ,
因此-
通过名称过滤器将当前文件夹“ piped”(=已过滤)IMG_20171225_*

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.