我想使用命令行来确定文件的位置。我努力了:
find . -type f -name "postgis-2.0.0"
和
locate postgis-2.0.0
无济于事。提供文件名的命令是什么以确定文件的目录?
postgis-2.0.0
。通常在通过程序包管理器安装后,可执行文件将位于其中一个$PATH
文件夹中,请尝试which postgis
查看位置。如果未返回任何内容,则只有您应该手动查找文件位置。
我想使用命令行来确定文件的位置。我努力了:
find . -type f -name "postgis-2.0.0"
和
locate postgis-2.0.0
无济于事。提供文件名的命令是什么以确定文件的目录?
postgis-2.0.0
。通常在通过程序包管理器安装后,可执行文件将位于其中一个$PATH
文件夹中,请尝试which postgis
查看位置。如果未返回任何内容,则只有您应该手动查找文件位置。
Answers:
试试吧find ~/ -type f -name "postgis-2.0.0"
。
使用.
将仅搜索当前目录。 ~/
将搜索整个主目录(可能是您下载到的主目录)。如果您wget
以root用户身份使用,则可能在其他地方,因此可以使用/
它搜索整个文件系统。
祝好运
wget
是root,所以/
工作了,谢谢
我会尝试:
sudo find / -type d -name "postgis-2.0.0"
的。表示仅在当前目录中搜索,如果您真的不知道,最好从root搜索所有内容。同样,键入-f表示搜索文件,而不是文件夹。添加后sudo
,它可以搜索所有文件夹/子文件夹。
您的语法locate
正确,但是您可能必须运行
sudo updatedb
第一。不管出于什么原因,我都没有好运locate
。
locate
使用由制作的文件和目录数据库updatedb
。因此,如果您下载了新文件,则很有可能updatedb
尚未更新文件和目录的数据库。您可以sudo updatedb
在使用locate
实用程序之前使用。
updatedb
通常在Linux系统上每天单独运行一次。
find是最有用的Linux / Unix工具之一。
尝试 find . -type d | grep DIRNAME
其他答案很好,但是我发现省略Permission denied
语句可以使我得到更清晰的答案(stderr
由于未运行,省略了sudo
):
find / -type f -iname "*postgis-2.0.0*" 2>/dev/null
哪里:
/
可以替换为您要从其开始搜索的目录f
d
如果要搜索目录而不是文件,可以替换为-iname
-name
如果您希望搜索区分大小写,则可以替换为*
如果您不希望在搜索中使用通配符,则可以省略搜索项中的s一种替代方法是:
find / -type f 2>/dev/null | grep "postgis-2.0.0"
如果搜索字词与完整文件路径中的任意位置匹配,则这种方式将返回结果 /home/postgis-2.0.0/docs/Readme.txt
-regex
和用-iregex
进行搜索的开关Regular Expressions
,它们也可以找到提及的路径。建议查找文件(-type f
)的任何项目,这样会浪费grep
更多资源。Permission denied
如果用户无权访问文件或文件夹,则在使用sudo
find之前使用将允许find查看所有文件。
-wholename
或-iwholename
代替管道grep
。
这应该简化文件的定位:
这将为您提供文件的完整路径
tree -f / | grep postgis-2.0.0
树以树状格式列出目录的内容。在-f
讲述树给出完整的文件路径。由于我们不知道它的位置或父位置,因此最好从文件系统根/
向下递归搜索。然后,我们将输出发送到grep以突出显示我们的单词,postgis-2.0.0
尽管find
命令是递归遍历目录树的最简单方法,但还有其他方法,特别是默认情况下,Ubuntu附带的两种脚本语言已经可以做到这一点。
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具有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))
locate
命令很好,只需使用命令首先更新locatedbupdatedb