Jak mogę wykluczyć wszystkie wiadomości "Odmowa uprawnień" z "Znajdź"?

Muszę ukryć wszystkie permission denied wiadomości od:

find . > files_and_folders
Eksperymentuję, kiedy pojawia się taka wiadomość. Muszę zebrać wszystkie foldery i pliki, do których nie powstają.

Czy możliwe jest skierowanie poziomów uprawnień do pliku files_and_folders?

Jak mogę ukryć błędy w tym samym czasie?

Author: Jahid, 2009-04-18

18 answers

Uwaga:
* Ta odpowiedź prawdopodobnie sięga głębiej niż wymaga tego przypadek użycia i find 2>/dev/null może być wystarczająco dobra w wielu sytuacjach. Może to być nadal interesujące dla perspektywy wieloplatformowej i dla jego omówienia niektórych zaawansowanych technik powłoki w interesie znalezienia rozwiązania, które jest jak najbardziej solidne, nawet jeśli przypadki strzeżone przed mogą być w dużej mierze hipotetyczne.
* Jeśli Twój system jest skonfigurowany do wyświetlania zlokalizowanych komunikatów o błędach , przedrostek find wywołania poniżej z LC_ALL=C (LC_ALL=C find ...) aby upewnić się, że angielski wiadomości są zgłaszane, tak aby grep -v 'Permission denied' działa zgodnie z przeznaczeniem. Niezmiennie jednak wszelkie komunikaty o błędach wyświetlane do będą również wyświetlane w języku angielskim.

Jeśli twoja powłoka jest bash lub zsh, istnieje rozwiązanie, które jest solidne, a jednocześnie dość proste, używając tylko funkcji zgodnych z POSIX find ; podczas gdy bash nie jest częścią POSIX, najbardziej nowoczesnego Uniksa platforma jest z nim, dzięki czemu rozwiązanie to jest szeroko przenośne: [91]}

find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)

Uwaga: Istnieje niewielka szansa, że niektóre z wyjść grep mogą pojawić się po find Kończy się, ponieważ Komenda ogólna nie czeka na zakończenie komendy wewnątrz >(...). W bash Możesz temu zapobiec, dołączając | cat do polecenia.

  • >(...) is a (rzadko używany) output podstawienie procesu, które umożliwia przekierowanie wyjścia (w tym przypadku, stderr Wyjście (2>) na stdin komendy wewnątrz >(...).
    Oprócz bash, oraz zsh, ksh obsługuje je również w zasadzie, ale próba połączenia ich z przekierowaniem z stderr , jak to jest zrobione tutaj (2> >(...)), wydaje się być po cichu ignorowana (w ksh 93u+).

    • grep -v 'Permission denied' filtry out (-v) wszystkie linie (ze strumienia stderr polecenia find), które zawierają frazę Permission denied i wyprowadzają pozostałe linie do stderr (>&2).

Podejście to jest:

  • Solidna: grep jest stosowana tylko do komunikatów o błędach (a nie DO KOMBINACJI ścieżek plików i komunikatów o błędach, potencjalnie prowadzących do fałszywych alarmów), a komunikaty o błędach innych niż Odmowa uprawnień są przekazywane do stderr.

  • Bez efektu ubocznego: find's kod wyjścia jest zachowany: niemożność dostępu do co najmniej jednego z systemów plików napotkane elementy dają wynik w kodzie wyjścia 1 (chociaż to nie powie Ci, czy wystąpiły błędy inne niż Odmowa uprawnień).


Rozwiązania zgodne z POSIX:

W pełni zgodne z POSIX rozwiązania mają ograniczenia lub wymagają dodatkowej pracy.

Jeśli wyjście find ma być przechwycone w pliku w każdym razie (lub całkowicie zablokowane), To rozwiązanie oparte na potoku z Jonathana Lefflera odpowiedź jest prosta, solidna i zgodna z POSIX:

find . 2>&1 >files_and_folders | grep -v 'Permission denied' >&2

Zwróć uwagę, że kolejność przekierowań ma znaczenie: 2>&1 musi nadejść najpierw .

Przechwytywanie wyjścia stdout w pliku z przodu pozwala 2>&1wysyłać tylko komunikaty o błędach przez potok, który grep może następnie jednoznacznie działać.

Jedynym minusem jest to, że ogólny kod wyjścia będzie grep poleceniem , a nie find, co w tym przypadku oznacza: jeśli istnieje brak błędów w ogóle lub tylko Odmowa uprawnień, kod zakończenia będzie 1 (sygnalizacja awaria), w przeciwnym razie (błędy inne niż Odmowa uprawnień) 0-co jest przeciwieństwem intencji.
to powiedziawszy, kod wyjścia find jest rzadko używany, ponieważ często przekazuje niewiele informacji pozapodstawową porażką, taką jak przejście nieistniejącej ścieżki.
Jednak szczególny przypadek nawet tylko niektórych z ścieżki wejściowe są niedostępne z powodu braku uprawnień jest odzwierciedlone w kodzie wyjścia find (zarówno w GNU, jak i BSD find): Jeśli dla dowolnego przetworzonego pliku wystąpi błąd odmowy uprawnień, kod wyjścia zostanie ustawiony na 1.

Następująca odmiana adresuje, że:

find . 2>&1 >files_and_folders | { grep -v 'Permission denied' >&2; [ $? -eq 1 ]; }

Teraz kod wyjścia wskazuje, czy jakieś błędy inne niż Permission denied wystąpił: 1 jeśli tak, 0 w przeciwnym razie.
Innymi słowy: kod wyjścia odzwierciedla teraz prawdziwa intencja polecenia: success (0) jest zgłaszana, jeśli w ogóle nie wystąpiły błędy lub wystąpił tylko błąd odmowy uprawnień (permission-denied errors).
Jest to prawdopodobnie nawet lepsze niż podanie kodu wyjścia find, jak w rozwiązaniu na górze.


Gniourf_gniourf w komentarzach proponuje (nadal zgodne z POSIX) uogólnienie tego rozwiązania za pomocą wyrafinowanych przekierowań, które działa nawet przy domyślnym zachowaniu wydruku pliku ścieżki do stdout:

{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1

W skrócie: Niestandardowy deskryptor pliku 3 jest używany do tymczasowej wymiany stdout (1) i stderr (2), tak aby same komunikaty błędów mogły być przesyłane do grep przez stdout.

Bez tych przekierowań, obie dane (ścieżki plików) i komunikaty o błędach byłyby przesyłane do grep przez stdout, a grep nie byłyby w stanie rozróżnić komunikatu o błędzie Permission denied oraz (hipotetyczny) plik, którego nazwa zawiera frazę Permission denied.

Podobnie jak w pierwszym rozwiązaniu, zgłoszony kod wyjścia będzie wynosił grep, a nie find, ale można zastosować tę samą poprawkę, co powyżej.


Uwagi na istniejące odpowiedzi:

  • Jest kilka punktów, które należy zwrócić uwagę na odpowiedź Michaela Bruxa, find . ! -readable -prune -o -print:

    • Wymaga GNU find; co ważne, nie będzie działać na macOS. Oczywiście, jeśli potrzebujesz tylko polecenie do pracy z GNU find, nie będzie to dla was problemem.

    • Niektóre błędy Permission denied mogą nadal surface: find ! -readable -prunezgłaszać takie błędy dla potomka pozycji katalogów, dla których bieżący użytkownik ma uprawnienia r, ale nie ma uprawnień x (wykonywalnych). Powodem jest to, że ponieważ sam katalog jest czytelny, -prune nie jest wykonywany, a próba zejścia do ten katalog uruchamia błąd wiadomości. To powiedziawszy, typowy przypadek dotyczy r pozwolenia na zaginięcie.

    • Uwaga: poniższy punkt jest kwestią filozofii i / lub konkretnego przypadku użycia, i możesz zdecydować, że nie jest on odpowiedni dla Ciebie i że polecenie dobrze pasuje do Twoich potrzeb, zwłaszcza jeśli po prostu drukowanie ścieżek jest wszystkim, co robisz:

      • jeśli konceptualizujesz filtrowanie komunikatów o błędach odmownych uprawnień a oddzielne zadanie , które chcesz mieć możliwość ubiegania się o dowolny find polecenie, a następnie odwrotne podejście proaktywnie zapobieganie błędom odmawiającym uprawnień wymaga wprowadzenia" szumu " do polecenia find, które wprowadza również złożoność i logiczne pułapki .
      • na przykład, najbardziej głosowany komentarz do odpowiedzi Michaela (w chwili pisania tego tekstu) próbuje pokazać, jak rozszerzyć przez dodanie filtra -name, w następujący sposób:
        find . ! -readable -prune -o -name '*.txt'
        To jednak, czy Nie działa zgodnie z przeznaczeniem, ponieważ końcowa -print akcja jest wymagana (Wyjaśnienie można znaleźć w ta odpowiedź ). Takie subtelności mogą wprowadzać błędy.
  • Pierwsze rozwiązanie w odpowiedź Jonathana Lefflera, find . 2>/dev/null > files_and_folders, jak sam stwierdza, ślepo milczywszystkie komunikaty o błędach (a obejście jest kłopotliwe i nie do końca solidne, jak również wyjaśnia). pragmatycznie mówiąc , jest to jednak najprostsze rozwiązanie , ponieważ możesz być zadowolony, zakładając, że wszelkie błędy będą związane z pozwoleniem.

  • Odpowiedź mgły, sudo find . > files_and_folders, jest zwięzły i pragmatyczny, ale źle radzi sobie z czymś innym niż tylko drukowanie nazw plików, ze względów bezpieczeństwa: ponieważ działasz jako użytkownik root , " ryzykujesz, że cały Twój system zostanie namieszany przez błąd w find lub złośliwą wersję, w przeciwieństwie do innych gier z serii mist, które nie są dostępne w wersji na konsole Xbox 360, nie są dostępne w wersji na konsole Xbox 360 i Xbox 360, ale nie są dostępne w wersji na konsole Xbox 360 i Xbox 360.

  • Drugie rozwiązanie w odpowiedzi viraptora, find . 2>&1 | grep -v 'Permission denied' > some_file generuje ryzyko fałszywych alarmów (z powodu wysyłania mieszanki stdout i stderr przez rurociąg), i potencjalnie, zamiast raportowania błędów non-permission-denied przez stderr, przechwytuje je wraz z ścieżki wyjściowe w pliku wyjściowym.

 170
Author: mklement0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:38

Użycie:

find . 2>/dev/null > files_and_folders

To ukrywa nie tylko Permission denied błędy, oczywiście, ale wszystkie komunikaty o błędach.

Jeśli naprawdę chcesz zachować inne możliwe błędy, takie jak zbyt wiele przeskoków na dowiązaniu symbolicznym, ale nie Odmowa uprawnień, prawdopodobnie będziesz musiał zgadnąć, że nie masz zbyt wielu plików o nazwie 'Odmowa uprawnień' i spróbować:

find . 2>&1 | grep -v 'Permission denied' > files_and_folders

Jeśli chcesz filtrować tylko standardowy błąd, możesz użyć bardziej rozbudowanego Budowa:

find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2

Przekierowanie wejścia / wyjścia w Komendzie find to: 2>&1 > files_and_folders |. Rura przekierowuje standardowe wyjście na polecenie grep i jest stosowana jako pierwsza. 2>&1 wysyła standardowy błąd do tego samego miejsca co standardowe wyjście (rura). > files_and_folders wysyła standardowe wyjście (ale nie standardowy błąd) do pliku. Wynik netto jest taki, że komunikaty zapisane do standardowego błędu są wysyłane w dół potoku i regularne wyjście find jest zapisywane do pliku. grep filtruje standardowe wyjście (można zdecyduj, jak selektywne ma być to, i może trzeba zmienić pisownię w zależności od locale I O / S), A ostateczna >&2 oznacza, że zachowane komunikaty o błędach (zapisywane na standardowe wyjście) przejść do błędu standardowego raz jeszcze. Ostateczne przekierowanie można uznać za opcjonalne na terminalu, ale bardzo dobrym pomysłem byłoby użycie go w skrypcie, aby komunikaty o błędach pojawiały się na standardowym błędzie.

Istnieją nieskończone wariacje na ten temat, w zależności od tego, co chcesz zrobić. To będzie praca na dowolnym wariancie Uniksa z dowolną pochodną powłoki Bourne ' a (Bash, Korn, ...) i dowolną wersją zgodną z POSIXfind.

Jeśli chcesz dostosować się do konkretnej wersji find posiadanej w Twoim systemie, mogą być dostępne alternatywne opcje. W szczególności GNU find ma niezliczoną ilość opcji niedostępnych w innych wersjach - zobacz aktualnie akceptowaną odpowiedź na jeden z takich zestawów opcji.

 501
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 19:30:23

Użycie:

find . ! -readable -prune -o -print

Lub bardziej ogólnie

find <paths> ! -readable -prune -o <other conditions like -name> -print
  • aby uniknąć "Permission denied"
  • i nie wyłączaj (innych) komunikatów o błędach
  • i uzyskać status wyjścia 0 ("wszystkie pliki są przetwarzane pomyślnie")

Działa z: find (GNU findutils) 4.4.2. Tło:

  • test -readable dopasowuje czytelne pliki. Operator ! zwraca true, gdy test jest false. I ! -readable dopasowuje nieczytelne katalogi (&pliki).
  • The -prune akcja nie schodzi do katalogu.
  • ! -readable -prune można przetłumaczyć NA: jeśli katalog nie jest czytelny, nie zstępuj do niego.
  • test -readable uwzględnia listy kontroli dostępu i inne artefakty uprawnień, które Test -perm ignoruje.

Zobacz find(1) strona Man aby uzyskać więcej szczegółów.

 253
Author: Michael Brux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 17:39:27

Jeśli chcesz rozpocząć wyszukiwanie z katalogu głównego"/", prawdopodobnie zobaczysz wyniki takie jak:

find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied
To z powodu pozwolenia. Aby rozwiązać ten problem:
  1. Możesz użyć polecenia sudo: sudo find /. -name 'toBeSearched.file'. pyta hasło super użytkownika, po wprowadzeniu hasła zobaczysz wynik, który naprawdę chcesz.

  2. Możesz użyć przekierowania standardowego wyjścia błędu z (Zazwyczaj Wyświetlacza / ekranu) do jakiegoś pliku i uniknąć wyświetlania komunikatów o błędach na ekranie! przekierowanie do specjalnego plik / dev /null:

    find /. -name 'toBeSearched.file' 2>/dev/null
    
  3. Możesz użyć przekierowania standardowego wyjścia błędu z (ogólnie Display / Screen)do standardowego wyjścia (ogólnie Display/Screen), następnie wykonaj polecenie grep z parametrem-v "invert", aby nie zobaczyć linii wyjściowych, które mają pary słów "Permission denied":

    find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'
    
 105
Author: Fatih Aksu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-31 18:54:48

Musiałem użyć:

find / -name expect 2>/dev/null

Podanie nazwy tego, co chciałem znaleźć, a następnie polecenie przekierowania wszystkich błędów do /dev / null

Expect jest lokalizacją programu expect, którego szukałem.

 83
Author: Jeremy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-31 03:27:02

Przełącz stderr Na /dev/null używając 2> / dev / null

find . -name '...' 2>/dev/null

 50
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 18:46:48

Możesz również użyć predykatów -perm i -prune, aby uniknąć zstępowania do nieczytelnych katalogów (Zobacz także Jak usunąć polecenia wydruku "permission denied" z programu find? - Wymiana Stosów Unix & Linux):

find . -type d ! -perm -g+r,u+r,o+r -prune -o -print > files_and_folders
 29
Author: sdaau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:36:27

Przekierowanie błąd standardowy. Na przykład, jeśli używasz bash na komputerze uniksowym, Możesz przekierować standardowy błąd do /dev / null w następujący sposób:

find . 2>/dev/null >files_and_folders
 22
Author: Jason Coco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-17 21:57:44

Podczas gdy powyższe podejścia nie dotyczą przypadku Mac OS X, ponieważ Mac Os X nie obsługuje -readable przełącznik w ten sposób można uniknąć błędów "Odmowa uprawnień" w wyjściu. To może komuś pomóc.

find / -type f -name "your_pattern" 2>/dev/null.

Jeśli używasz innego polecenia z find, na przykład, aby znaleźć rozmiar plików określonego wzorca w katalogu 2>/dev/null, nadal będzie działać jak pokazano poniżej.

find . -type f -name "your_pattern" -exec du -ch {} + 2>/dev/null | grep total$.

Zwróci Całkowity rozmiar plików danego wzorca. Uwaga 2>/dev/null na końcu polecenia find.

 19
Author: Bunti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 09:55:44

Te błędy są wypisywane na standardowym wyjściu błędu (fd 2). Aby je odfiltrować, po prostu przekieruj wszystkie błędy do /dev/null:

find . 2>/dev/null > some_file

Lub najpierw Dołącz stderr i stdout, a następnie grep out tych konkretnych błędów:

find . 2>&1 | grep -v 'Permission denied' > some_file
 13
Author: viraptor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-17 22:00:10

Prosta odpowiedź:

find . > files_and_folders 2>&-

2>&- zamyka (-) standardowy deskryptor pliku błędu (2), więc wszystkie komunikaty o błędach są wyciszane.

  • kod wyjścia będzie nadal 1, Jeśli jakiekolwiek błędy 'Permission denied' zostaną wydrukowane

Solidna odpowiedź dla GNU find:

find . -type d \! \( -readable -executable \) -prune -print -o -print > files_and_folders

przekazać dodatkowe opcje find, które -prune (zapobiec zejściu do), ale nadal -print dowolny katalog (-typed) to nie (\!) mieć oba -readable oraz -executable uprawnienia, lub (-o) -print inne akta.

  • -readable oraz -executable opcje są rozszerzeniami GNU, a nie częścią standardu POSIX
  • może nadal zwracać "Permission denied " W przypadku nieprawidłowych/uszkodzonych plików (np. zobacz raport o błędzie wpływający na systemy plików montowane w kontenerach Przy Użyciu lxcfs

Solidna odpowiedź, która działa z dowolnym zgodnym z POSIX find (GNU, OSX / BSD, itp.)

{ LC_ALL=C find . 3>&2 2>&1 1>&3 > files_and_folders | grep -v 'Permission denied'; [ $? = 1 ]; } 3>&2 2>&1

użycie potoku do przekazania standardowego strumienia błędów do grep, usunięcie wszystkich linii zawierających ciąg 'Permission denied'.

LC_ALL=C Ustawia locale POSIX za pomocą zmiennej środowiskowej , 3>&2 2>&1 1>&3 oraz 3>&2 2>&1 duplikat deskryptorów plików , aby skierować strumień błędu standardowego do grep, oraz [ $? = 1 ] zastosowania [] odwrócenie kodu błędu zwracanego przez grep w celu przybliżenia oryginalnego zachowania find.

  • filtruje również wszelkie błędy 'Permission denied' spowodowane przekierowaniem wyjścia (np. jeśli plik files_and_folders nie jest zapisywalny)
 10
Author: wjordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 03:42:35

Aby uniknąć Tylko ostrzeżeń o odmowie uprawnień, powiedz find, aby zignorował nieczytelne pliki, przycinając je z wyszukiwania. Dodaj wyrażenie jako OR do znaleziska, np.

find / \! -readable -prune -o -name '*.jbd' -ls

To najczęściej mówi (dopasuj nieczytelny plik i usuń go z listy) lub (dopasuj nazwę jak*.jbd i wyświetla go [z ls]) . (Pamiętaj, że domyślnie wyrażenia są I ' d razem, chyba że używasz -or.) Potrzebujesz-ls w drugim wyrażeniu albo find może dodać domyślną akcję pokazującą dopasowanie, która pokaże również wszystkie nieczytelne pliki.

Ale jeśli szukasz prawdziwych plików w systemie, zwykle nie ma powodu, aby szukać w /dev, który ma wiele wielu plików, więc powinieneś dodać wyrażenie, które wyklucza ten katalog, jak:

find / -mount \! -readable -prune  -o  -path /dev -prune  -o  -name '*.jbd' -ls

Więc (dopasuj plik nieczytelny i przycinanie z listy) lub (dopasuj ścieżkę /dev i przycinanie z listy) lub (dopasuj plik jak *.jbd i wyświetlanie it) .

 4
Author: simpleuser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-16 00:59:49

Użyj

sudo find / -name file.txt

To głupie (bo podnosisz wyszukiwarkę) i nonsensowne, ale o wiele krótsze do napisania.

 4
Author: mist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-16 12:01:46

Żadna z powyższych odpowiedzi nie zadziałała dla mnie. Wszystko, co znajdę w Internecie, koncentruje się na: ukrywaniu błędów. Żaden poprawnie nie obsługuje procesu return-code / exit-code. Używam polecenia find w skryptach bash, aby zlokalizować niektóre katalogi, a następnie sprawdzić ich zawartość. Oceniam polecenie find success używając kodu wyjścia: wartość zero działa, w przeciwnym razie nie.

ODPOWIEDŹ udzielona powyżej przez Michael Brux działa czasami. Ale mam jeden scenariusz, w którym to się nie uda! Odkryłem problem i sam go naprawiłem. Muszę przycinać pliki, gdy:

it is a directory AND has no read access AND/OR has no execute access

Zobacz tutaj: i/lub. Jedna dobra sugerowana Sekwencja stanu, którą przeczytałem, to:

-type d ! -readable ! -executable -prune
To nie zawsze działa. Oznacza to, że śliwka jest wyzwalana, gdy dopasowanie jest:
it is directory AND no read access AND no execute access

Ta sekwencja wyrażeń nie powiedzie się, gdy dostęp do odczytu jest przyznany, ale nie ma dostępu do execute.

Po kilku testach zdałem sobie z tego sprawę i zmieniłem moje rozwiązanie skryptu powłoki na:

Nice find / home*/ - maxdepth 5-follow \
    \ (- type d-a ! \ (- readable-a-executable \) \) -śliwka \
    -o \
    \ (- type d-a-readable-a-executable-a-name "${m_find_name}"\) - print

Kluczem tutaj jest umieszczenie "nieprawda" dla wyrażenia połączonego:

has read access AND has execute access

W Przeciwnym Razie nie ma pełnego dostępu, co oznacza: przyciąć go. Okazało się to działać dla mnie w jednym scenariuszu, który poprzednie sugerowane rozwiązania zawiodły.

Podaję poniżej techniczne szczegóły dotyczące pytań w sekcji komentarze. Przepraszam, jeśli szczegóły są przesadne.

  • Dlaczego używać polecenia nice? Mam pomysł tutaj . Początkowo myślałem, że byłoby miło zredukować priorytet procesu podczas szukania całego systemu plików. Zdałem sobie sprawę, że nie ma to dla mnie sensu, ponieważ mój skrypt jest ograniczony do kilku katalogów. Zmniejszyłem maxdepth do 3.
  • dlaczego szukać w /home*/? To nie ma znaczenia dla tego wątku. Wszystkie aplikacje instaluję ręcznie za pomocą kodu źródłowego Kompiluj z nieuprzywilejowanymi użytkownikami(Nie root). Są one instalowane w "/ home". Mogę mieć wiele binariów i wersji mieszkających razem. Muszę zlokalizować wszystkie katalogi, sprawdzić i wykonać kopię zapasową w trybie master-slave. Mogę mieć więcej niż jeden" / home " (kilka dysków działających w ramach serwera dedykowanego).
  • dlaczego używasz-follow? Użytkownicy mogą tworzyć dowiązania symboliczne do katalogów. To zależy od użyteczności, muszę prowadzić rejestr absolutnych ścieżek znalezionych.
 2
Author: Jordi Ferran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31

Możesz użyć grep-v invert-match

-v, --invert-match        select non-matching lines

TAK:

find . > files_and_folders
cat files_and_folders | grep -v "permission denied" > files_and_folders

Powinien do magii

 2
Author: Leonardo Hermoso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-27 04:02:43

- = Dla MacOS= -

Wykonaj nowe polecenie używając aliasu: wystarczy dodać ~/.linia bash_profile:

alias search='find / -name $file 2>/dev/null'

I w nowym oknie terminala można go wywołać:

$ file=<filename or mask>; search

Na przykład:

$ file=etc; search

 0
Author: Jan aka uptech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-09 23:10:28

Jeśli używasz CSH lub TCSH, oto rozwiązanie:

( find . > files_and_folders ) >& /dev/null

Jeśli chcesz wyjść do terminala:

( find . > /dev/tty ) >& /dev/null

Jednakże, jak opisuje FAQ" csh-whynot", nie powinieneś używać CSH.

 0
Author: Kayle Sawyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-16 18:13:23

Możesz również łatwo umieścić wyniki wyszukiwania w pliku.

Znajdź . -name 'NameOfSearchedFile' > > results.txt

 -1
Author: korodani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 12:33:28