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

В моем ограниченном опыте, когда шпатлевка работает, но Linux, Ubuntu в этом случае, нет, она обычно сохраняется. Проблемы с сетью или сервером повлияют на обе клиентские ОС.

Вы можете использовать приведенную выше опцию keep alive в командной строке, но это довольно утомительно для ввода.

Легче редактировать несколько файлов конфигурации.

Если у вас есть root access, и вы хотите включить его автоматически для всех пользователей, отредактируйте /etc/ssh/ssh_config, добавьте

KeepAlive yes
ServerAliveInterval 120

Если у вас нет корня доступ или включить его для одного пользователя, отредактируйте ~/.ssh/config и добавьте те же две строки.

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

6 ответов

Я бы попытался:

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

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

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

sudo updatedb

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

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

27
ответ дан 25 May 2018 в 10:45

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

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

10
ответ дан 25 May 2018 в 10:45
  • 1
    Есть ли преимущество здесь в использовании grep over -name? – TryHarder 2 February 2016 в 03:40
  • 2
    @oooooo Я добавил причину в свой ответ ниже – zanbri 29 July 2016 в 18:38
  • 3
    find plus grep - единственное, что сработало для меня – malhal 3 February 2017 в 03:25

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

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

tree -f  / | grep postgis-2.0.0

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

2
ответ дан 25 May 2018 в 10:45

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

, где вы можете изменить «.» (посмотрите в текущем каталоге) на «/» (посмотрите на всю систему) или «~ /» (посмотрите в Home Directory ). где вы можете изменить «-name» на «-iname», если вы не хотите, чтобы с учетом регистра. где вы можете изменить «имя_файла» (файл, который может начинаться и заканчиваться тем, что он есть), до точного имени файла.
1
ответ дан 25 May 2018 в 10:45

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

Этот способ возвращает результаты, если поисковый термин совпадает в любом месте полного пути к файлу, например [F12]

0
ответ дан 25 May 2018 в 10:45
  • 1
    Существуют переключатели -regex и -iregex для поиска с помощью Regular Expressions, в котором также найдутся упоминания о пути. Предложение найти любой элемент, который является файлом (-type f), тогда grep является более дорогостоящим ресурсом. Permission denied происходит, когда пользователь не имеет доступа к файлам или папкам, используя sudo, прежде чем поиск позволит найти все файлы. – sdkks 29 July 2016 в 18:51
  • 2
    Хорошо знать о переключателях регулярных выражений, спасибо. – zanbri 29 July 2016 в 18:55
  • 3
    @zanbri Используйте -wholename или -iwholename вместо перехода к grep. – wjandrea 4 December 2016 в 12:13

Хотя команда find - это самый простой способ рекурсивного прохождения дерева каталогов, существуют другие способы, и, в частности, два языка сценариев, которые поставляются с Ubuntu по умолчанию, уже имеют возможность сделать это.

bash

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
ответ дан 25 May 2018 в 10:45

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

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