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?
ls
?Odpowiedzi:
(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 tegols
, 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
ls
jest 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-d
mówi,ls
aby nigdy nie schodzić do katalogu.ls
ma opcję,-R
któ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 .
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*.txt
nie 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
Komenda 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 ustawiszshopt -s nullglob
, w którym to przypadku wzorzec rozwija się do pustej listy), a zsh sygnalizuje błąd (chyba że ustawiszsetopt nullglob
lubsetopt no_no_match
co powoduje, że wzór pozostaje niezmieniony).Nadal możesz chcieć używać
ls
jego opcji. Na przykładls
moż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:-print
jest akcją (większość innych akcji polega na wykonaniu polecenia z pliku);-print
sugeruje się, że jeśli nie podejmiesz akcji . Ponadto, jeśli nie określisz żadnego katalogu do przejścia (/some/dir
powyż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 -1
pasują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 jestInnym 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ąlocate
przejęciafind /
jest to, że dużo szybciej. Minusem jest to, że jego informacje mogą być nieaktualne. Istnieje kilka implementacjilocate
różniących się zachowaniem w systemach wieloużytkownikowych:locate
program podstawowy indeksuje tylko pliki czytelne publicznie (możesz uruchomić kompan,updatedb
aby utworzyć drugą bazę danych, która indeksuje wszystkie pliki na koncie); istnieją inne wersje (mlocate, slocate), które indeksują wszystkie pliki, alocate
program filtruje bazę danych, aby zwracać tylko te pliki, które widzisz.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 .źródło
odpowiednikiem twojego przykładu DOS byłoby:
W systemie Linux generalnie nie potrzebujesz już
-print
argumentu. Jeśli pracujesz na innych systemach operacyjnych, warto o tym wiedzieć.źródło
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)
locate
konfiguruje codziennecron
zadanie, 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ż
find
lubls
po prostu uruchomienie,sudo updatedb
a następnielocate
. Jest zdecydowanie szybszy, jeśli musisz przeprowadzić więcej wyszukiwań ... jak sama nazwa wskazuje,updatedb
aktualizuje bazę danych, któralocate
używa ...locate
ma wbudowane wyrażenie regularne, co czyni go bardzo przydatnym ... Użyjęfind
w skrypcie, ale rzadko używamfind
w wierszu poleceń. Używam nawetlocate
w (osobistych) skryptach ... np.locate -bir "oo.*datt.*mp4$"
locate
zwraca w pełni kwalifikowane ścieżki dopasowanych plików.źródło
Na przykład, jeśli chcę wyszukać w katalogu / home nazwę pliku zawierającego foo, użyłbym polecenia:
użyj polecenia,
man find
aby uzyskać więcej informacji na temat polecenia find i argumentów,źródło
*
aby zapobiec ich interpretacji przez powłokę.