Linuks, find, jak pozbyć się komunikatu “Permission denied”

Linuksowa komenda find jest dość potężna: potrafi nie tylko przeszukiwać foldery, ale również wykonywać dowolne polecenie systemu operacyjnego na znalezionych plikach. Może nie brzmi to zbyt ekscytująco, ale daje naprawdę ogromne możliwości.

find ma jednak jedną, niewielką wadę: jeżeli przeszukujemy dużo folderów, rosną szanse, że trafimy na folder, do którego nie mamy dostępu. W efekcie zobaczymy mnóstwo komunikatów w rodzaju “find: nazwa folderu: Permission denied

Czasem takie “śmieci” mogą nam przeszkadzać. Jak się tego pozbyć?

Metod jest kilka. Najlepszą przedstawiam poniżej:

find . -name *czegoszukam* 2> >(grep -v "Permission denied" >&2)

Powyższa składnia jest dość egzotyczna, choć całkiem logiczna:

2> oznacza przekierowanie strumienia błędów do…

>( jakaś komenda) – jeżeli po przekierowaniu wstawimy spację a potem polecenie zamknięte w >(...) to oznacza, że przekierowujemy dane do tej komendy. Tu mamy na końcu jeszcze >&2 oznaczające, że jakiekolwiek wyjście komendy grep ma trafić do strumienia numer 2 (czyli strumienia błędów).

Czyli, krok po kroku, nasza cała komenda oznacza:

  • znajdź wszystkie pliki zawierające w nazwie “czegoszukam”
  • jeżeli pojawią się jakiekolwiek błędy, wyślij je do komendy grep -v "Permission denied"
  • Jeżeli dany komunikat błędu zawiera tekst “Permission denied”, zignoruj go (-v), w przeciwnym razie wyświetl w strumieniu błędów (>&2)

Trochę skomplikowane, ale to tak naprawdę najlepsza metoda: po pierwsze jest szybko, bo grep włączy się tylko w przypadku wystąpienia błędów (nie przepuszczamy przez grep-a wszystkich danych wygenerowanych przez find, tylko komunikaty błędów) – a po drugie zachowujemy kod wyjścia polecenia find (w razie gdybyśmy chcieli sprawdzić, czy w ogóle wystąpiły jakieś błędy).

Inne rozwiązania na ogół bazują na operatorze | który sprawia, że cała komenda zwróci kod wyjścia (“exit code”) ostatniego polecenia w ciągu, czyli w tym przypadku grep. A używając przekierowania typu >(...) całość zwróci kod wyjścia polecenia find, czyli zgodnie z intuicją.

Nie wiem, czy kiedykolwiek przyjdzie mi użyć powyższego w praktyce, ale warto wiedzieć, że jest taka opcja.

Liczba słów w tym wpisie: 367

Sprawdź też

Siedem tygodni, czyli rzecz o szukaniu pracy w czasach zarazy

Blog mi ostatnio zwolnił do ślimaczego tempa. Trochę dlatego, że postanowiłem sobie zrobić przerwę od …

Pchełki Powershell: odzyskujemy klucz aktywacyjny do Windows 10

Niedawno zachciało mi się na jednym z domowych laptopów przetestować Docker for Windows. Niektóre opcje …

Zapisz się
Powiadom o
guest
4 komentarzy
Inline Feedbacks
Zobacz wszystkie komentarze
4
0
Zapraszam do skomentowania wpisu.x
()
x