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

132

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

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

и

locate postgis-2.0.0

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

    
задан Sam007 31.05.2012 в 19:02
источник

8 ответов

164

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

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

Гудлак

    
ответ дан adempewolff 31.05.2012 в 19:06
источник
28

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

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-системах.

    
ответ дан reverendj1 31.05.2012 в 19:12
11

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

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

    
ответ дан Mitch 31.05.2012 в 19:11
4

Другие ответы хороши, но я нахожу, что omitting Permission denied операторов дает мне более четкие ответы (omits stderr s из-за того, что не работает 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

    
ответ дан zanbri 29.07.2016 в 17:35
2

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

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

tree -f  / | grep postgis-2.0.0

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

    
ответ дан ptetteh227 18.11.2017 в 04:16
1

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

  • , где вы можете изменить «.» (посмотрите в Current Directory) на «/» (посмотрите на всю систему) или «~ /» (зайдите в Home Directory).

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

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

ответ дан RuiVBoas 13.03.2017 в 11:05
0

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

    
ответ дан Jadeye 08.09.2018 в 10:38
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

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))
    
ответ дан Sergiy Kolodyazhnyy 13.07.2017 в 04:23