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

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




locate postgis-2.0.0


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

评论

定位命令很好,只需使用命令updatedb
首先更新locatedb

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

#1 楼

请尝试使用find ~/ -type f -name "postgis-2.0.0"

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

Goodluck

评论


哦,是的,我以wget为根,所以/工作感谢

– Sam007
2012年5月31日17:09

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

– habibun
16 Dec 4'在5:03

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

–爱德华
18年6月14日在14:08

#2 楼

我会尝试:

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


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

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

sudo updatedb


第一。无论出于什么原因,我都不会对locate感到好运。

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

#3 楼

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

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


其中:



/可以替换为要从中开始搜索的目录

f可以替换为d(如果要搜索目录而不是目录)如果您希望搜索区分大小写,则文件

-iname可以替换为-name
如果您不想在搜索中使用通配符,则可以省略搜索词中的*

替代方法是:

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


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

评论


有-regex和-iregex开关用于使用正则表达式进行搜索,它们也可以找到路径提及。建议先查找文件(-f型),然后使用grep进行查找,这会占用更多资源。当用户无权访问文件或文件夹时,将发生权限被拒绝的情况,在find之前使用sudo将允许find查看所有文件。

–sdkks
16年7月29日在15:51

很高兴了解正则表达式开关,谢谢。

– zanbri
16年7月29日在15:55

@zanbri使用-wholename或-iwholename代替管道传递到grep。

– wjandrea
16 Dec 4'在8:13



#4 楼

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

尝试find . -type d | grep DIRNAME

评论


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

– TryHarder
16年2月1日在23:40

@oooooo我在下面的答案中添加了一个原因

– zanbri
16年7月29日在15:38

find plus grep是唯一对我有用的东西

– Malhal
17年2月2日在23:25

#5 楼

尝试find . -name "*file_name*"


,您可以在其中将'。'(查找当前目录)更改为'/'(查找整个系统)或'〜/'(查找主目录) )。
如果不希望区分大小写,则可以在其中将“ -name”更改为“ -iname”。
可以在其中更改“ file_name”(可以以其开头和结尾的文件)到文件的确切名称。


#6 楼

这应该简化文件的定位:

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

tree -f  / | grep postgis-2.0.0


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

#7 楼

虽然find命令是递归遍历目录树的最简单方法,但是还有其他方法,特别是Ubuntu随附的两种脚本语言默认已经可以这样做。
bash

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

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


Perl

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

 #!/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

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))
 


#8 楼

$ find . -type f | grep IMG_20171225_*
给出./03-05--2018/IMG_20171225_200513.jpg
命令find之后的DOT指出起始点,因此-当前文件夹
“ piped”(=已过滤)通过名称过滤器IMG_20171225_*