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?
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óczbash
, orazzsh
,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 (wksh 93u+
).-
grep -v 'Permission denied'
filtry out (-v
) wszystkie linie (ze strumienia stderr poleceniafind
), 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ścia1
(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>&1
wysył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 GNUfind
, nie będzie to dla was problemem.Niektóre błędy
Permission denied
mogą nadal surface:find ! -readable -prune
zgłaszać takie błędy dla potomka pozycji katalogów, dla których bieżący użytkownik ma uprawnieniar
, 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 dotyczyr
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 poleceniafind
, 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.
-
jeśli konceptualizujesz filtrowanie komunikatów o błędach odmownych uprawnień a oddzielne zadanie , które chcesz mieć możliwość ubiegania się o dowolny
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.
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.
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.
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:
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.-
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
-
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'
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.
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
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
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
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.
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
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 (-type
d
) 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życiulxcfs
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 plikfiles_and_folders
nie jest zapisywalny)
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) .
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.
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.
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
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
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.
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
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