find . -type f -name "postgis-2.0.0"
和
locate postgis-2.0.0
无济于事。如果提供文件名,确定文件目录的命令是什么?
#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_*
评论
定位命令很好,只需使用命令updatedb首先更新locatedb
如果已经安装,则新文件名可能不再是postgis-2.0.0。通常在通过程序包管理器安装后,可执行文件将位于$ PATH文件夹之一中,尝试使用哪种postgis来查看位置。如果未返回任何内容,则只有您应该手动查找文件位置。