Знайдіть файл за іменем за допомогою командного рядка


182

Я хотів би визначити розташування файлу за допомогою командного рядка. Я намагався:

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

Відповіді:


231

Спробуйте find ~/ -type f -name "postgis-2.0.0"замість цього.

Використання .буде шукати лише в поточному каталозі. ~/буде шукати весь ваш домашній каталог (можливо, там, де ви його завантажили). Якщо ви використовували wgetяк root, можливо, це може бути десь інше, щоб ви могли використовувати /для пошуку всієї файлової системи.

Удачі


1
о, я використовував wgetяк root так /працював спасибі
Sam007

для більш детальної перевірки цього посилання help.ubuntu.com/community/find
habibun

Я можу знайти: / Users / UserName // Бібліотека / Збережений стан програми / com.bitrock.appinstaller.savedState: У дозволі відхилено помилку. вона з’являється при кожному виконанні команди. Як позбутися від нього?
Едуард

29

Я б спробував:

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

The. означає пошук тільки в поточному каталозі, найкраще шукати все з кореня, якщо ви насправді не знаєте. Також type -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

знайти плюс grep було єдиним, що працювало для мене
маль

12

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

1
Приємно знати про перемикачі регулярного вибору, дякую.
zanbri

@zanbri Використовуйте -wholenameабо -iwholenameзамість того, щоб виконати трубопроводи до grep.
wjandrea

4

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

  • де ви можете змінити "." (загляньте в поточний каталог) на "/" (загляньте у всю систему) або "~ /" (подивіться в домашній каталог).

  • де ви можете змінити "-имено" на "-інім", якщо ви не хочете, щоб вони не залежно від регістру.

  • де ви можете змінити " ім'я_файлу " (файл, який може починатись і закінчуватися тим, що він є) на саме ім'я файлу.


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вказати початкову точку,
Звідси - поточну папку,
"piped" (= фільтрується) через фільтр іменIMG_20171225_*

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.