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


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

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

а также

locate postgis-2.0.0

но безрезультатно. Какая команда определяет каталог файла, если его имя?


125
2018-05-31 17:02


происхождения


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


ответы:


Пытаться find ~/ -type f -name "postgis-2.0.0" вместо.

С помощью . будет искать только текущий каталог. ~/ будет искать ваш домашний каталог (вероятно, где вы его загрузили). Если вы использовали wget как корень, его возможно, это может быть где-то еще, чтобы вы могли использовать / для поиска всей файловой системы.

Удачи


154
2018-05-31 17:06



ой, я использовал wget как корень, так / работал благодаря - Sam007
для дополнительной проверки этой ссылки help.ubuntu.com/community/find - habibun
Я получаю find: / Users / UserName // Library / Saved Application State / com.bitrock.appinstaller.savedState: ошибка отказа от прав. он появляется при каждом выполнении команды. Как избавиться от него? - Eduard


Я бы попробовал:

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

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

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

sudo updatedb

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

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


28
2018-05-31 17:12





find - один из самых полезных инструментов Linux / Unix.

Пытаться find . -type d | grep DIRNAME


11
2018-05-31 17:11



Есть ли преимущество здесь в использовании grep over -name? - TryHarder
@oooooo Я добавил причину в свой ответ ниже - zanbri
find plus grep - единственное, что сработало для меня - malhal


Другие ответы хороши, но я считаю, что 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


2
2017-07-29 15:35



Есть -regex а также -iregex переключатели для поиска с Regular Expressions, который также найдет упоминание о пути. Предложение найти любой элемент, который является файлом (-type f) тогда grep является более дорогостоящим ресурсом. Permission denied происходит, когда пользователь не имеет доступа к файлам или папкам, используя sudo перед поиском позволит найти все файлы. - sdkks
Хорошо знать о переключателях регулярных выражений, спасибо. - zanbri
@zanbri Использовать -wholename или -iwholename вместо того, чтобы grep, - wjandrea


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

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

tree -f  / | grep postgis-2.0.0

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


2
2017-11-18 03:16





Пытаться find . -name "*file_name*"

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

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

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


1
2018-03-13 10:05





В то время как 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

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

0
2017-07-13 02:23





$ find . -type f | grep IMG_20171225_*
дает
./03-05--2018/IMG_20171225_200513.jpg
DOT после команды find состоит в том, чтобы указать начальную точку,
Следовательно - текущая папка,
«piped» (= фильтрованный) через фильтр имен IMG_20171225_*


0
2017-09-08 08:38