Jak znaleźć plik w systemie plików z wiersza poleceń?

10

Chciałbym dowiedzieć się, gdzie plik (z częściowo znaną nazwą pliku) znajduje się w systemie plików. Chciałbym wiedzieć, jak to zrobić z wiersza polecenia, a nie za pomocą narzędzia GUI.

W systemie Windows uruchomiłbym następujące:

cd /d C:\
dir *filename* /s

Co to jest odpowiednik systemu Linux?

Iszi
źródło
Cóż, jest oczywiście więcej niż jeden sposób na skórowanie tego kota. Nadal jestem trochę ciekawy, czy jest jakiś sposób, aby to zrobić ls?
Iszi

Odpowiedzi:

13
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*

(Czytaj dalej, aby zapoznać się z głównymi warunkami. Przeczytaj instrukcję dokładnego drukowania.)

Wyświetlanie zawartości katalogu jest swego rodzaju dodatkową funkcją ls. Głównym zadaniem tego ls, który zajmuje większość jego złożoności, jest dopracowanie wyświetlacza. (Spójrz na instrukcję i porównaj liczbę opcji związanych z wyborem plików do wyświetlenia w porównaniu z liczbą opcji, które kontrolują, jakie informacje mają być wyświetlane o każdym pliku i jak formatowany jest ekran. Jest to prawdą zarówno dla GNU ls, które „ Znajdę na Linuksie i innych systemach z mniejszą liczbą opcji, od wczesnych dni).

Domyślnym trybem lsjest to, że kiedy przekazujesz mu katalog, wyświetla on pliki w tym katalogu. Jeśli przekażesz mu dowolny inny typ pliku (zwykły plik, symboliczne łącze itp.), Wyświetla tylko ten plik. (Dotyczy to każdego argumentu osobno.) Opcja -dmówi, lsaby nigdy nie schodzić do katalogu.

lsma opcję, -Rktóra każe rekursywnie wyświetlać katalogi. Ale ma ograniczone zastosowanie i nie pozwala na wiele filtrowania na wyjściu.

Pierwszym narzędziem do wykonania dopasowania wzorca jest sama powłoka. Nie potrzebujesz żadnych innych poleceń: po prostu wpisz symbole wieloznaczne i gotowe. Jest to znane jako globbing .

echo *filename*

Tradycyjnie symbole wieloznaczne były ograniczone do bieżącego katalogu (lub wskazanego katalogu:) echo /some/where/*filename*. *Dopasowuje dowolną nazwę pliku, lub jakiejkolwiek części nazwy pliku, ale *.txtnie będzie pasował foo/bar.txt. Nowoczesne powłoki dodały wzorzec, **/który oznacza „w tym katalogu lub w dowolnym katalogu poniżej (rekurencyjnie)”. W przypadku bash, ze względu na historyczną zgodność, ta funkcja musi być wyraźnie włączona za pomocą shopt -s globstar(możesz umieścić tę linię w swoim ~/.bashrc).

echo **/*filename*

echoKomenda tylko echa listę nazw plików generowanych przez plecy powłoki na ciebie. Jako wyjątek, jeśli w ogóle nie ma pasującej nazwy pliku, wzór wieloznaczny pozostanie niezmieniony w bash (chyba że ustawisz shopt -s nullglob, w którym to przypadku wzorzec rozwija się do pustej listy), a zsh sygnalizuje błąd (chyba że ustawisz setopt nullgloblub setopt no_no_matchco powoduje, że wzór pozostaje niezmieniony).

Nadal możesz chcieć używać lsjego opcji. Na przykład lsmoże wskazywać charakter lub uprawnienia pliku (katalog, plik wykonywalny itp.) Za pomocą kolorów. Możesz wyświetlić datę, rozmiar i własność pliku za pomocą ls -l. Więcej instrukcji znajdziesz w instrukcji.

Tradycyjne polecenie szukania pliku w drzewie katalogów to find. Zawiera wiele opcji kontrolowania, które pliki mają być wyświetlane i co z nimi zrobić. Na przykład, aby wyszukać pliki, których nazwa pasuje do wzorca *filename*w bieżącym katalogu i jego podkatalogach i wydrukować ich nazwy:

find /some/dir -name '*filename*' -print

-printjest akcją (większość innych akcji polega na wykonaniu polecenia z pliku); -printsugeruje się, że jeśli nie podejmiesz akcji . Ponadto, jeśli nie określisz żadnego katalogu do przejścia ( /some/dirpowyżej), domyślny jest katalog bieżący. Warunek -name '*filename'mówi, aby wyświetlać (lub działać) tylko pliki, których nazwa pasuje do tego wzorca; istnieje wiele innych filtrów, na przykład -mtime -1pasujących do plików zmodyfikowanych w ciągu ostatnich 24 godzin. Czasami można pominąć cytaty -name '*filename*', ale tylko wtedy, gdy symbol wieloznaczny nie pasuje do żadnego pliku w bieżącym katalogu (patrz wyżej). Podsumowując, krótka forma jest

find -name '*filename*'

Innym przydatnym narzędziem, gdy znasz (część) nazwę pliku, jest locate. To narzędzie sprawdza bazę danych nazw plików. W typowych systemach jest odświeżany co noc. Zaletą locateprzejęcia find /jest to, że dużo szybciej. Minusem jest to, że jego informacje mogą być nieaktualne. Istnieje kilka implementacji locateróżniących się zachowaniem w systemach wieloużytkownikowych: locateprogram podstawowy indeksuje tylko pliki czytelne publicznie (możesz uruchomić kompan, updatedbaby utworzyć drugą bazę danych, która indeksuje wszystkie pliki na koncie); istnieją inne wersje (mlocate, slocate), które indeksują wszystkie pliki, a locateprogram filtruje bazę danych, aby zwracać tylko te pliki, które widzisz.

locate filename

Czasami myślisz, że plik jest dostarczany przez pakiet w twojej dystrybucji, znasz (część) nazwę pliku, ale nie nazwę pakietu, i chcesz zainstalować pakiet. Wiele dystrybucji zapewnia do tego narzędzie. Na Ubuntu to jest apt-file search filename. Aby uzyskać równoważne polecenia w innych systemach, sprawdź Pacman Rosetta .

Gilles „SO- przestań być zły”
źródło
Chciałbym móc ponownie głosować za tym. Po prostu musiałem dziś wieczorem sprawdzić inny projekt. Jeszcze raz dziękuję, @Gilles!
Iszi
6

odpowiednikiem twojego przykładu DOS byłoby:

cd /
find . -name \*filename\* -print

W systemie Linux generalnie nie potrzebujesz już -printargumentu. Jeśli pracujesz na innych systemach operacyjnych, warto o tym wiedzieć.

Tim Kennedy
źródło
5

Jeśli chcesz czegoś „szybkiego” , ale nie w sytuacji krytycznej i chcesz tylko wiedzieć, czy istnieje i gdzie to jest, możesz użyć locate. Przechowuje bazę danych wszystkich plików w katalogach, o których kazałeś jej gromadzić informacje.

W domyślnej instalacji (w systemie Ubuntu) locatekonfiguruje codzienne cronzadanie, które skanuje system plików i aktualizuje bazę danych ...

Jeśli uważasz, że musisz zaktualizować bazę danych przed następną aktualizacją crona, zwykle jest to szybsze niż findlub lspo prostu uruchomienie, sudo updatedba następnie locate. Jest zdecydowanie szybszy, jeśli musisz przeprowadzić więcej wyszukiwań ... jak sama nazwa wskazuje, updatedbaktualizuje bazę danych, która locateużywa ...

locatema wbudowane wyrażenie regularne, co czyni go bardzo przydatnym ... Użyję findw skrypcie, ale rzadko używam findw wierszu poleceń. Używam nawet locatew (osobistych) skryptach ... np.locate -bir "oo.*datt.*mp4$"

locate zwraca w pełni kwalifikowane ścieżki dopasowanych plików.

Peter.O
źródło
2
find [path] -name [filename]

Na przykład, jeśli chcę wyszukać w katalogu / home nazwę pliku zawierającego foo, użyłbym polecenia:

find /home -name *foo*

użyj polecenia, man findaby uzyskać więcej informacji na temat polecenia find i argumentów,

josh-cain
źródło
3
Musisz zacytować lub uciec, *aby zapobiec ich interpretacji przez powłokę.
Shawn J. Goff
Czy to jest specyficzne dla dystrybucji / powłoki? Uruchomiłem go w Fedorze 16 bez ucieczek i działało dobrze.
josh-cain
1
Istnieją opcje w niektórych powłokach, które przekazują gwiazdy do programu, jeśli nie pasują do niczego. Spróbuj utworzyć plik w bieżącym katalogu, który jest zgodny z tym wzorcem, i spróbuj ponownie wykonać polecenie.
Shawn J. Goff