Я хотел бы определить местоположение файла с помощью командной строки. Я пробовал:
find . -type f -name "postgis-2.0.0"
и
locate postgis-2.0.0
безрезультатно Что такое команда для определения каталога файла при условии его имени?
Попробуйте вместо этого find ~/ -type f -name "postgis-2.0.0"
.
Использование .
будет выполнять поиск только в текущем каталоге. ~/
выполнит поиск по всему домашнему каталогу (вероятно, там, где вы его скачали). Если вы использовали wget
в качестве пользователя root, возможно, это может быть где-то еще, поэтому вы можете использовать /
для поиска по всей файловой системе.
Гудлак
Я бы попробовал:
sudo find / -type d -name "postgis-2.0.0"
. означает поиск только в текущем каталоге, лучше всего искать в корне, если вы действительно не знаете. Кроме того, введите -f означает поиск файлов, а не папок. Добавление sudo
позволяет выполнять поиск во всех папках / подпапках.
Ваш синтаксис для locate
правильный, но вам, возможно, придется сначала запустить
sudo updatedb
. По какой-то причине мне никогда не везет с locate
.
locate
использует базу данных файлов и каталогов, созданных updatedb
. Поэтому, если вы загрузили новый файл, есть большая вероятность, что ваш updatedb
не обновил базу данных файлов и каталогов. Вы можете использовать sudo updatedb
перед использованием locate
служебной программы. updatedb
обычно запускается один раз в день в системах linux.
Другие ответы хороши, но я обнаружил, что пропущенные 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
Попробуйте find . -name "*file_name*"
, где вы можете изменить «.» (Просмотреть текущий каталог) на «/» (посмотреть всю систему) или «~ /» ( загляните в Домашний каталог).
, где вы можете изменить «-name» на «-iname», если не хотите вводить регистр.
где вы можете изменить « имя_файла » (файл, который может начинаться и заканчиваться чем угодно) на точное имя файла.
find - один из самых полезных инструментов для Linux / Unix.
Попробуйте find . -type d | grep DIRNAME
Это должно упростить поиск файла:
Это даст вам полный путь к файлу.
tree -f / | grep postgis-2.0.0
Дерево перечисляет содержимое каталогов в древовидном формате. -f
говорит дереву указать полный путь к файлу. так как мы не имеем представления о его расположении или родительском расположении, хорошо бы искать из корня файловой системы /
рекурсивно вниз. Затем мы отправляем вывод grep, чтобы выделить наше слово, postgis-2.0.0
$ find . -type f | grep IMG_20171225_*
Дает
./03-05--2018/IMG_20171225_200513.jpg
Точка после команды find
должна указать начальную точку,
Отсюда - текущая папка,
"передана по каналу" (= отфильтрована) через фильтр имен IMG_20171225_*
В то время как find
команда является самым простым способом рекурсивно пересечь дерево каталогов, существуют другие пути и в особенности два языка сценариев, которые идут с Ubuntu, по умолчанию уже имеют способность сделать так.
bash
имеет очень хорошее globstar
опция оболочки, которая допускает рекурсивный обход дерева каталогов. Все, что мы должны сделать, протестировать на ли объект в ./**/*
расширение является файлом и содержит ли оно требуемый текст:
bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done
./testdir/texts/postgis-2.0.0
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 является другим языком сценариев, который используется очень широко в мире 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))