Które polecenie systemu Linux należy wydać, aby uzyskać wykaz przedstawionych plików?
-rw-r--r-- 1 root 9216 paź 6 18:39 mama.xls
-rw-r--r-- 1 root 9216 paź 6 18:39 tata.txt
-rw-r--r-- 1 root 9216 paź 6 18:39 test2.jpg
-rw-r--r-- 1 root 9216 paź 6 18:39 test.jpgA. find *.jpg | *a*
B. ls -l *a* *.jpg
C. grep *a* *.jpg
D. dir *a*.jpg
Polecenie ls -l *a* *.jpg jest właściwe, bo łączy dwie ważne rzeczy: wyświetlanie szczegółowej listy plików oraz dopasowanie nazw za pomocą masek, czyli tzw. globów powłoki. Opcja -l w poleceniu ls oznacza długi format listowania. Dzięki temu widać uprawnienia, liczbę dowiązań, właściciela, rozmiar, datę modyfikacji i nazwę pliku, czyli dokładnie taki układ jak w przykładzie: -rw-r--r-- 1 root 9216 paź 6 18:39 nazwa_pliku.
Maska *a* wybiera pliki, które mają literę „a” w nazwie, więc pasują tu mama.xls oraz tata.txt. Maska *.jpg wybiera wszystkie pliki z rozszerzeniem .jpg, czyli test2.jpg i test.jpg. Razem daje to komplet pokazany w wykazie. Warto pamiętać, że gwiazdka nie jest obsługiwana bezpośrednio przez ls, tylko najpierw rozwija ją powłoka, na przykład bash. Dopiero potem ls dostaje gotową listę nazw plików.
W praktyce to bardzo częste użycie w administracji Linuxem: szybkie wyszukiwanie plików po fragmencie nazwy i jednoczesne sprawdzenie uprawnień. Moim zdaniem dobrze jest zawsze patrzeć, czy potrzebujemy zwykłego ls, czy ls -l, bo przy diagnostyce praw dostępu sam spis nazw to często za mało. Dobra praktyka jest też taka, żeby uważać na wzorce nachodzące na siebie — jeśli jakiś plik pasowałby i do *a*, i do *.jpg, mógłby zostać przekazany do polecenia dwa razy.
Maska *a* wybiera pliki, które mają literę „a” w nazwie, więc pasują tu mama.xls oraz tata.txt. Maska *.jpg wybiera wszystkie pliki z rozszerzeniem .jpg, czyli test2.jpg i test.jpg. Razem daje to komplet pokazany w wykazie. Warto pamiętać, że gwiazdka nie jest obsługiwana bezpośrednio przez ls, tylko najpierw rozwija ją powłoka, na przykład bash. Dopiero potem ls dostaje gotową listę nazw plików.
W praktyce to bardzo częste użycie w administracji Linuxem: szybkie wyszukiwanie plików po fragmencie nazwy i jednoczesne sprawdzenie uprawnień. Moim zdaniem dobrze jest zawsze patrzeć, czy potrzebujemy zwykłego ls, czy ls -l, bo przy diagnostyce praw dostępu sam spis nazw to często za mało. Dobra praktyka jest też taka, żeby uważać na wzorce nachodzące na siebie — jeśli jakiś plik pasowałby i do *a*, i do *.jpg, mógłby zostać przekazany do polecenia dwa razy.
W tym zadaniu kluczowe jest rozróżnienie między listowaniem plików, filtrowaniem nazw przez powłokę oraz przeszukiwaniem zawartości plików. Pokazany wynik ma format typowy dla ls -l, bo zawiera uprawnienia w stylu -rw-r--r--, właściciela root, rozmiar, datę modyfikacji i nazwę pliku. Samo dopasowanie nazw nie wystarczy, trzeba jeszcze użyć opcji dającej długi format wyjścia.
Polecenie dir *a*.jpg nie pasuje do sytuacji, ponieważ wzorzec *a*.jpg oznacza pliki, które jednocześnie zawierają literę „a” w nazwie i mają rozszerzenie .jpg. W pokazanym zestawie pliki z literą „a” to mama.xls oraz tata.txt, ale one nie są JPEG-ami. Pliki test.jpg i test2.jpg mają rozszerzenie .jpg, ale nie zawierają litery „a”. Poza tym dir zwykle nie pokazuje takiego szczegółowego formatu jak ls -l, chyba że użyje się odpowiednich opcji.
grep nie służy do wypisywania wykazu plików w tym sensie. To narzędzie do szukania tekstu wewnątrz plików lub w strumieniu danych. Częsty błąd polega na myśleniu, że skoro grep „coś znajduje”, to nadaje się do znajdowania nazw plików w katalogu. Tu jednak potrzebujemy listowania katalogu, nie analizy zawartości plików binarnych czy tekstowych.
Konstrukcja find *.jpg | *a* też jest myląca. find może wyszukiwać pliki, ale podany zapis jest niepoprawny jako sensowne polecenie do uzyskania takiego wykazu. Po znaku potoku musi znajdować się program, który przyjmie dane ze standardowego wejścia. Wzorzec *a* nie jest programem, tylko maską rozwijaną przez powłokę do nazw plików. Z mojego doświadczenia to typowy problem: miesza się potok, symbole wieloznaczne i polecenia, które działają na zupełnie innych poziomach. W Linuksie warto pamiętać: ls listuje, grep przeszukuje treść, find wyszukuje według kryteriów, a gwiazdka jest rozwijana wcześniej przez shell.
Polecenie dir *a*.jpg nie pasuje do sytuacji, ponieważ wzorzec *a*.jpg oznacza pliki, które jednocześnie zawierają literę „a” w nazwie i mają rozszerzenie .jpg. W pokazanym zestawie pliki z literą „a” to mama.xls oraz tata.txt, ale one nie są JPEG-ami. Pliki test.jpg i test2.jpg mają rozszerzenie .jpg, ale nie zawierają litery „a”. Poza tym dir zwykle nie pokazuje takiego szczegółowego formatu jak ls -l, chyba że użyje się odpowiednich opcji.
grep nie służy do wypisywania wykazu plików w tym sensie. To narzędzie do szukania tekstu wewnątrz plików lub w strumieniu danych. Częsty błąd polega na myśleniu, że skoro grep „coś znajduje”, to nadaje się do znajdowania nazw plików w katalogu. Tu jednak potrzebujemy listowania katalogu, nie analizy zawartości plików binarnych czy tekstowych.
Konstrukcja find *.jpg | *a* też jest myląca. find może wyszukiwać pliki, ale podany zapis jest niepoprawny jako sensowne polecenie do uzyskania takiego wykazu. Po znaku potoku musi znajdować się program, który przyjmie dane ze standardowego wejścia. Wzorzec *a* nie jest programem, tylko maską rozwijaną przez powłokę do nazw plików. Z mojego doświadczenia to typowy problem: miesza się potok, symbole wieloznaczne i polecenia, które działają na zupełnie innych poziomach. W Linuksie warto pamiętać: ls listuje, grep przeszukuje treść, find wyszukuje według kryteriów, a gwiazdka jest rozwijana wcześniej przez shell.