Найдите файл по имени с помощью командной строки

Я хотел бы определить местоположение файла с помощью командной строки. Я пытался:

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"

. означает поиск только в текущем каталоге, лучше всего искать все из корня, если вы действительно не знаете. Кроме того, type -f означает поиск файлов, а не папок. Добавление sudo позволяет ему выполнять поиск во всех папках / вложенных папках.

Ваш синтаксис для locate правильно, но вам, возможно, придется запустить

sudo updatedb

первый. По какой-то причине мне никогда не везет с locate хотя.

locate использует базу данных файлов и каталогов, созданных updatedb. Так что, если вы загрузили новый файл, есть больше шансов, что ваш updatedb не обновил базу данных файлов и каталогов. Вы можете использовать sudo updatedb перед использованием locate служебная программа.updatedb обычно запускается один раз в день самостоятельно в системах Linux.

Другие ответы хороши, но я нахожу, что опускаю Permission denied заявления дают мне более четкие ответы (опускает stderrs из-за того, что он не работает 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 - один из самых полезных инструментов Linux / Unix.

Попробуй find . -type d | grep DIRNAME

Попробуй find . -name "*file_name*"

  • где вы можете изменить '.'(заглянуть в текущий каталог) на '/' (заглянуть во всю систему) или '~/' (заглянуть в Домашний каталог).

  • где вы можете изменить "-name" на "-iname", если не хотите учитывать регистр.

  • где вы можете измениться "имя_файла"(файл, который может начинаться и заканчиваться чем угодно) с точным именем файла.

Это должно упростить поиск файла:

Это даст вам полный путь к файлу

tree -f  / | grep postgis-2.0.0

Древовидный список содержимого каталогов в древовидном формате. то -f сообщает дереву указать полный путь к файлу. поскольку мы понятия не имеем о его местоположении или родительском местоположении, хорошо бы выполнить поиск из корня файловой системы / рекурсивно вниз.Затем мы отправляем выходные данные в grep, чтобы выделить наше слово, postgis-2.0.0

Пока 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

В Perl есть модуль поиска, который позволяет выполнять рекурсивный обход дерева каталогов и с помощью подпрограммы выполнять с ними определенные действия. С помощью небольшого скрипта вы можете обойти дерево каталогов, поместить файлы, содержащие нужную строку, в массив, а затем распечатать ее следующим образом:

#!/usr/bin/env perluse 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 pythonimport 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))

$ find . -type f | grep IMG_20171225_*
Дает
./03-05--2018/IMG_20171225_200513.jpg
ТОЧКА после команды find состоит в том, чтобы указать отправную точку,
Следовательно - текущая папка,
"передано по каналу" (=отфильтровано) через фильтр имен IMG_20171225_*

команда locate в порядке, просто сначала обновите locatedb, используя команду updatedb

Если он уже установлен, новое имя файла может больше не быть postgis-2.0.0. Обычно после установки через менеджеры пакетов исполняемые файлы будут находиться в одной из папок “$PATH”, попробуйте “which postgis”, чтобы увидеть местоположение. Если он ничего не возвращает, только тогда вы должны вручную искать местоположение файла.