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

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

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

и

locate postgis-2.0.0

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

188
задан 20 April 2017 в 20:54

8 ответов

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

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

Гудлак

0
ответ дан 20 April 2017 в 20:54

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

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

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

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

sudo updatedb

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

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

0
ответ дан 20 April 2017 в 20:54

Другие ответы хороши, но я обнаружил, что пропущенные 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

0
ответ дан 20 April 2017 в 20:54

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

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

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

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

0
ответ дан 20 April 2017 в 20:54

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

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

0
ответ дан 20 April 2017 в 20:54

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

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

tree -f  / | grep postgis-2.0.0

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

0
ответ дан 20 April 2017 в 20:54

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

0
ответ дан 20 April 2017 в 20:54

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

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
ответ дан 20 April 2017 в 20:54

Другие вопросы по тегам:

Похожие вопросы: