Znajdź plik według nazwy za pomocą wiersza polecenia


182

Chciałbym określić lokalizację pliku za pomocą wiersza polecenia. Próbowałem:

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

i

locate postgis-2.0.0

bezskutecznie. Jakie jest polecenie określające katalog pliku, pod warunkiem jego nazwy?


2
locatekomenda jest w porządku, po prostu zaktualizować locatedb pierwsze, za pomocą poleceniaupdatedb
— thucnguyen

Jeśli jest już zainstalowany, nowa nazwa pliku może postgis-2.0.0już nie być . Zwykle po instalacji za pomocą menedżerów pakietów pliki wykonywalne byłyby w jednym z $PATHfolderów, spróbuj which postgiszobaczyć lokalizację. Jeśli nic nie zwraca, tylko powinieneś ręcznie poszukać lokalizacji pliku.
— sdkks

Odpowiedzi:


231

Spróbuj find ~/ -type f -name "postgis-2.0.0"zamiast tego.

Używanie .przeszuka tylko bieżący katalog. ~/przeszuka cały katalog domowy (prawdopodobnie skąd go pobrałeś). Jeśli użyłeś wgetjako root, możliwe, że może być gdzie indziej, więc możesz użyć /do przeszukiwania całego systemu plików.

Powodzenia


1
o wgettak, użyłem jako root, więc /działało dzięki
— Sam007

Aby uzyskać więcej, sprawdź ten link help.ubuntu.com/community/find
— habibun

Otrzymuję find: / Users / UserName // Library / Saved Application State / com.bitrock.appinstaller.savedState: Błąd odmowy uprawnień. pojawia się przy każdym wykonaniu polecenia. Jak się tego pozbyć?
— Eduard,

29

Spróbowałbym:

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

The. oznacza wyszukiwanie tylko w bieżącym katalogu, najlepiej przeszukać wszystko od roota, jeśli naprawdę nie wiesz. Ponadto typ -f oznacza wyszukiwanie plików, a nie folderów. Dodanie sudopozwala na wyszukiwanie we wszystkich folderach / podfolderach.

Twoja składnia locatejest poprawna, ale może być konieczne uruchomienie

sudo updatedb

pierwszy. Z jakiegokolwiek powodu nigdy nie mam szczęścia locate.

locatekorzysta z bazy danych plików i katalogów wykonanych przez updatedb. Jeśli więc pobrałeś nowy plik, istnieje większe prawdopodobieństwo, że updatedbnie zaktualizowałeś bazy danych plików i katalogów. Możesz użyć sudo updatedbprzed użyciem locateprogramu narzędziowego. updatedbzazwyczaj działa raz dziennie na systemach Linux.


14

find jest jednym z najbardziej użytecznych narzędzi Linux / Unix.

Próbować find . -type d | grep DIRNAME


Czy jest tutaj jakaś korzyść z używania grep nad-name?
— TryHarder

@oooooo Dodałem powód w mojej odpowiedzi poniżej
— zanbri

find plus grep było jedyną rzeczą, która działała dla mnie
— malhal

12

Inne odpowiedzi są dobre, ale stwierdzenie, że pominięcie Permission deniedinstrukcji daje mi jaśniejsze odpowiedzi (pomija się z stderrpowodu nie uruchomienia sudo):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null

gdzie:

  • / można zastąpić katalogiem, od którego chcesz rozpocząć wyszukiwanie
  • fmożna zastąpić, djeśli szukasz katalogu zamiast pliku
  • -inamemożna zastąpić, -namejeśli chcesz, aby wyszukiwanie uwzględniało wielkość liter
  • *sw szukanej można pominąć, jeśli nie chcesz symboli wieloznacznych w wyszukiwaniu

Alternatywą jest:

find / -type f 2>/dev/null | grep "postgis-2.0.0"

W ten sposób zwracane są wyniki, jeśli wyszukiwane hasło pasuje gdziekolwiek w pełnej ścieżce pliku, np /home/postgis-2.0.0/docs/Readme.txt


2
Są -regexi -iregexprzełączniki do wyszukiwania Regular Expressions, które również mogłyby znaleźć wzmiankę o ścieżce. Sugestia znalezienia dowolnego elementu, który jest plikiem ( -type f), grepjest wówczas droższa pod względem zasobów. Permission deniedzdarza się, gdy użytkownik nie ma dostępu do plików lub folderów, użycie sudoprzed znalezieniem pozwoli znaleźć wszystkie pliki.
— sdkks

1
Dobrze wiedzieć o przełącznikach regex, dzięki.
— zanbri

@zanbri Użyj -wholenamelub -iwholenamezamiast do potokowania do grep.
— wjandrea

4

Próbować find . -name "*file_name*"

  • gdzie możesz zmienić „.” (zajrzyj do bieżącego katalogu) na „/” (spójrz na cały system) lub „~ /” (zajrzyj do katalogu domowego).

  • gdzie możesz zmienić „-name” na „-iname”, jeśli nie chcesz rozróżniać wielkości liter.

  • gdzie możesz zmienić „ nazwa_pliku ” (plik, który może zaczynać się i kończyć czymkolwiek jest) na dokładną nazwę pliku.


3

To powinno uprościć lokalizację pliku:

To da ci pełną ścieżkę do pliku

tree -f  / | grep postgis-2.0.0

Drzewo wyświetla zawartość katalogów w formacie drzewiastym. -fmówi drzewa, aby dać pełną ścieżkę dostępu do pliku. ponieważ nie mamy pojęcia o jego lokalizacji ani o lokalizacji nadrzędnej, dobrze jest wyszukiwać od katalogu głównego systemu plików /rekurencyjnie w dół. Następnie wysyłamy wyjście do grep, aby podświetlić nasze słowo,postgis-2.0.0


0

Chociaż findpolecenie jest najprostszym sposobem rekurencyjnego przechodzenia przez drzewo katalogów, istnieją inne sposoby, w szczególności dwa języki skryptowe, które są domyślnie dostarczane z Ubuntu, już mają taką możliwość.

grzmotnąć

bash ma bardzo ładną globstaropcję powłoki, która pozwala na rekurencyjne przechodzenie do drzewa katalogów. Wszystko, co musimy zrobić, to sprawdzić, czy element w ./**/*rozwinięciu jest plikiem i czy zawiera pożądany tekst:

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 ma moduł Find, który pozwala na rekursywne przechodzenie do drzewa katalogów i wykonywanie pod nimi określonych czynności. Za pomocą małego skryptu można przechodzić przez drzewo katalogów, wypychać pliki zawierające żądany ciąg znaków do tablicy, a następnie drukować w następujący sposób:

#!/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"
}

I jak to działa:

$ ./find_file.pl  "postgis-2.0.0"                                                       
./testdir/texts/postgis-2.0.0

Pyton

Python to kolejny język skryptowy, który jest bardzo szeroko stosowany w świecie Ubuntu. W szczególności posiada os.walk()moduł, który pozwala nam wykonać taką samą akcję jak powyżej - przejść drzewo katalogów i uzyskać listę plików zawierających pożądany ciąg.

Jako jedno-liniowy można to zrobić w następujący sposób:

$ 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']

Pełny skrypt wyglądałby tak:

#!/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_*
Podaje
./03-05--2018/IMG_20171225_200513.jpg
DOT po poleceniu, findaby podać punkt początkowy,
Stąd - bieżący folder,
„potokowany” (= przefiltrowany) przez filtr nazwIMG_20171225_*

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.