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


183

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

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

а также

locate postgis-2.0.0

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


2
locateкоманда хорошо, просто обновить locatedb первых, с помощью командыupdatedb
thucnguyen

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

Ответы:


232

Попробуй find ~/ -type f -name "postgis-2.0.0"вместо.

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

Удачи


1
о да, я использовал wgetкак root, так что /работало спасибо
Sam007

для получения дополнительной информации проверьте эту ссылку help.ubuntu.com/community/find
habibun

Я получаю поиск: / Users / Имя пользователя // Библиотека / Состояние сохраненного приложения / com.bitrock.appinstaller.savedState: Ошибка «Отказано в доступе». это появляется при каждом выполнении команды. Как от этого избавиться?
Эдуард

29

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

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

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

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

sudo updatedb

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

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


14

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

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


Есть ли здесь преимущество использования grep over -name?
TryHarder

@oooooo Я добавил причину в своем ответе ниже
zanbri

найти плюс греп был единственным, что сработало у меня
малхал

12

Другие ответы хороши, но я обнаружил, что пропущенные Permission deniedутверждения дают мне более четкие ответы (пропускает stderrs из-за не запуска 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
Существуют -regexи -iregexпереключатели для поиска Regular Expressions, которые также находят упоминания пути. Предложение найти какой-либо элемент, который является файлом ( -type f), grepявляется более дорогим ресурсом. Permission deniedпроисходит, когда пользователь не имеет доступа к файлам или папкам, использование sudoдо поиска позволит найти все файлы.
sdkks

1
Полезно знать о регулярных выражениях, спасибо.
Занбри

@zanbri Используйте -wholenameили -iwholenameвместо того, чтобы пускать по трубам grep.
wjandrea

4

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

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

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

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


3

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

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

tree -f  / | grep postgis-2.0.0

Дерево отображает содержимое каталогов в древовидном формате. -fговорит дерево , чтобы дать полный путь к файлу. так как мы не имеем ни малейшего представления о его местонахождении или родительском расположении, хорошо бы поискать от корня файловой системы /рекурсивно вниз. Затем мы отправляем вывод grep, чтобы выделить наше слово,postgis-2.0.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 есть модуль 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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.