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?

Sam007
źródło
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

adempewolff
źródło
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.

reverendj1
źródło
14

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

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

Mitch
źródło
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

zanbri
źródło
2
-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.

RuiVBoas
źródło
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

ptetteh227
źródło
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))
Sergiy Kolodyazhnyy
źródło
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_*

Jadeje
źródło