Uwaga:
* Ta odpowiedź prawdopodobnie jest głębsza niż uzasadnia przypadek użycia i find 2>/dev/null
może być wystarczająca w wielu sytuacjach. Może to nadal być interesujące z perspektywy wieloplatformowej i do dyskusji nad niektórymi zaawansowanymi technikami powłoki w celu znalezienia rozwiązania, które jest tak solidne, jak to możliwe, nawet jeśli chronione przypadki mogą być w dużej mierze hipotetyczne.
* Jeśli Twój system jest skonfigurowany do wyświetlania zlokalizowanych komunikatów o błędach , poprzedzaj find
poniższe wywołania znakiem LC_ALL=C
( LC_ALL=C find ...
), aby mieć pewność, że komunikaty w języku angielskim będą zgłaszane, aby grep -v 'Permission denied'
działało zgodnie z przeznaczeniem. Niezmiennie jednak żadnych komunikatów o błędach, które należy uzyskać wyświetlane będzie wówczas także w języku angielskim.
Jeśli twoja powłoka jest bash
lubzsh
, istnieje rozwiązanie, które jest solidne, a jednocześnie dość proste , wykorzystując tylko find
funkcje zgodne z POSIX ; chociaż bash
sam nie jest częścią POSIX, większość współczesnych platform Unixowych jest z nim wyposażona, dzięki czemu to rozwiązanie jest przenośne:
find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)
Uwaga: Istnieje niewielka szansa, że niektóre grep
dane wyjściowe mogą pojawić się po find
zakończeniu, ponieważ ogólne polecenie nie czeka na zakończenie polecenia w środku >(...)
. W bash
można temu zapobiec, dołączając | cat
do polecenia.
>(...)
jest (rzadko stosowane) wyjście podstawienie proces , który umożliwia przekierowanie wyjścia (w tym przypadku, stderr wyjście ( 2>
) z stdin wewnątrz polecenia >(...)
.
Oprócz bash
a zsh
, ksh
wspiera ich, jak również co do zasady , ale stara się połączyć je z przekierowaniem z stderr , jak to zrobiono tutaj ( 2> >(...)
), wydaje się być dyskretnie ignorowane (in ksh 93u+
).
grep -v 'Permission denied'
filtruje się ( -v
) wszystkie linie (od find
stderr strumienia komendy użytkownika), które zawierają frazę Permission denied
i wysyła pozostałe linie na stderr ( >&2
).
Podejście to:
solidny : grep
jest stosowany 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 inne niż te, którym odmówiono zgody, są przekazywane do stderr.
bez skutków ubocznych : find
kod wyjścia jest zachowany: niemożność uzyskania dostępu do co najmniej jednego z napotkanych elementów systemu plików skutkuje kodem wyjścia 1
(chociaż nie powie to, czy wystąpiły również błędy inne niż odmowa uprawnień).
Rozwiązania zgodne z POSIX:
Rozwiązania w pełni zgodne z POSIX mają ograniczenia lub wymagają dodatkowej pracy.
Jeśli find
„s wyjściowy ma być ujęte w pliku, w każdym razie (albo całkowicie stłumiony), a następnie roztwór rurociągu z podstawki odpowiedzi Jonathan Lefflera jest prosta, solidna i POSIX:
find . 2>&1 >files_and_folders | grep -v 'Permission denied' >&2
Pamiętaj, że kolejność przekierowań ma znaczenie: 2>&1
musi być na pierwszym miejscu .
Przechwytywanie wyjścia standardowego w pliku z góry umożliwia 2>&1
wysyłanie tylko komunikatów o błędach przez potok, który grep
następnie może jednoznacznie działać.
Jedynym minusem jest to, że ogólny kod wyjścia będzie grep
komenda jest , a nie find
„s, co w tym przypadku oznacza: jeśli istnieją żadne błędy w ogóle lub jedynie błędów braku-zaprzeczyć, kod wyjścia będzie 1
(sygnalizacja awarii ), w przeciwnym razie ( błędy inne niż odmowa zgody) 0
- co jest przeciwieństwem zamiaru.
Mimo to find
kod wyjścia jest rzadko używany , ponieważ często przekazuje niewiele informacji poza podstawową awarią, taką jak przejście nieistniejącej ścieżki.
Jednak szczególny przypadek nawet tylko niektórychścieżek wejściowych jest niedostępne z powodu braku uprawnień jest odzwierciedlone w find
„s kod wyjścia (zarówno GNU oraz BSD find
): jeśli wystąpi błąd uprawnienia-odmówiono na każdy z plików przetworzonych, kod wyjścia jest ustawiony 1
.
Następująca odmiana dotyczy:
find . 2>&1 >files_and_folders | { grep -v 'Permission denied' >&2; [ $? -eq 1 ]; }
Teraz kod wyjścia wskazuje, czy wystąpiły błędy inne niż Permission denied
wystąpiły: 1
jeśli tak, w 0
przeciwnym razie.
Innymi słowy: kod wyjścia odzwierciedla teraz prawdziwy cel polecenia: sukces ( 0
) jest zgłaszany, jeśli nie wystąpiły żadne błędy lub wystąpiły tylko błędy odmowy uprawnień.
Jest to prawdopodobnie nawet lepsze niż przekazywanie find
kodu wyjścia, jak w rozwiązaniu u góry.
gniourf_gniourf w komentarzach proponuje (nadal zgodne z POSIX) uogólnienie tego rozwiązania przy użyciu wyrafinowanych przekierowań , które działa nawet przy domyślnym zachowaniu drukowania ścieżek plików na standardowe wyjście :
{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
W skrócie: deskryptor klienta 3
służy do tymczasowego wymiany stdout ( 1
) i stderr ( 2
) tak, że komunikaty o błędach sam może być wyprowadzony do grep
poprzez standardowe wyjście.
Bez tych przekierowań zarówno dane (ścieżki plików), jak i komunikaty o błędach byłyby przesyłane potokowo grep
przez stdout, a grep
wówczas nie byłyby w stanie odróżnić komunikatu o błędzie Permission denied
od pliku (hipotetycznego) , którego nazwa zawiera zdarzenie Permission denied
.
Tak jak w pierwszym rozwiązaniu, kod wyjścia zgłoszony będzie jednak grep
„nie find
”, ale można zastosować tę samą poprawkę, co powyżej.
Uwagi na temat istniejących odpowiedzi:
Istnieje kilka punktów, aby pamiętać o odpowiedź Michaela Brüx za , find . ! -readable -prune -o -print
:
Wymaga GNU find
; w szczególności nie będzie działać na macOS. Oczywiście, jeśli potrzebujesz tylko polecenia do pracy z GNU find
, nie będzie to dla ciebie problemem.
Niektóre Permission denied
błędy mogą się nadal pojawiać: find ! -readable -prune
zgłasza takie błędy w elementach podrzędnych katalogów, do których bieżący użytkownik ma r
uprawnienia, ale brakuje x
uprawnień (wykonywalnych). Powodem jest to, że ponieważ sam katalog jest czytelny, -prune
nie jest wykonywany, a próba zejścia do tego katalogu wywołuje następnie komunikaty o błędach. To powiedziawszy, typowym przypadkiem jest brak r
pozwolenia.
Uwaga: Poniższy punkt jest kwestią filozofii i / lub konkretnego przypadku użycia i możesz zdecydować, że nie jest on dla ciebie odpowiedni i że polecenie dobrze pasuje do twoich potrzeb, szczególnie jeśli wystarczy wydrukować ścieżki:
- Jeśli konceptualizujesz filtrowanie komunikatów o błędach odmowy uprawnień jako osobne zadanie, które chcesz zastosować do dowolnego
find
polecenia, wówczas odwrotne podejście do proaktywnego zapobiegania błędom odmowy uprawnień wymaga wprowadzenia do find
polecenia „szumu” , co również wprowadza złożoność i logiczne pułapki .
- Na przykład najbardziej pozytywnie oceniany komentarz do odpowiedzi Michaela (w chwili pisania tego tekstu) próbuje pokazać, jak rozszerzyć polecenie, włączając
-name
filtr w następujący sposób:
find . ! -readable -prune -o -name '*.txt'
To jednak nie działa zgodnie z przeznaczeniem, ponieważ wymagane-print
jest działanie końcowe (wyjaśnienie można znaleźć w tej odpowiedzi ). Takie subtelności mogą wprowadzać błędy.
Pierwsze rozwiązanie w odpowiedzi Jonathan Leffler jest , find . 2>/dev/null > files_and_folders
jak sam twierdzi, ślepo wycisza wszystkie komunikaty o błędach (a obejście jest uciążliwe i nie w pełni niezawodne, jak wyjaśnia również). Pragmatycznie rzecz biorąc , jest to jednak najprostsze rozwiązanie , ponieważ możesz z zadowoleniem założyć, że wszelkie błędy będą związane z uprawnieniami.
Odpowiedź zMist , sudo find . > files_and_folders
, jest zwięzły i pragmatyczne, ale źle poinformowani o niczym innym niż tylko drukowanie nazw , ze względów bezpieczeństwa: ponieważ używasz jako głównego użytkownika „, istnieje ryzyko konieczności całego systemu są pomieszane w wyniku błędu w znalezisku lub złośliwą wersję lub niepoprawne wywołanie, które pisze coś nieoczekiwanie, co nie mogłoby się zdarzyć, gdybyś uruchomił to z normalnymi uprawnieniami ”(na podstawie komentarza do odpowiedzi mgły przez trójkę ).
2. rozwiązanie w odpowiedzi viraptor za , find . 2>&1 | grep -v 'Permission denied' > some_file
ryzykuje fałszywych alarmów (ze względu na wysyłanie mieszankę stdout i stderr rurociągiem) oraz, potencjalnie, zamiast zgłaszać niż błędy -permission-odrzucona przez stderr, przechwytuje je obok torów wyjściowych w pliku wyjściowym.
find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2
:?{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
>(...)
są specyficzne dla Bash.find
należy zachować i reklamować zachowaniefind
kodu wyjścia: kod wyjścia jest notorycznie bezużyteczny. Tutaj najprawdopodobniej będzie ona niezerowa (i bezużyteczna).execute/search
uprawnień w trybie plików, aby „przeszukać” katalog (pobrać i-węzły zawartych plików).find
robi to, aby zejść do podkatalogu (oprócz wymaganiaread
pozwolenia na listę plików w katalogu). To nie jest „błąd” ani „błąd przenoszenia”.Posługiwać się:
To oczywiście ukrywa nie tylko
Permission denied
błędy, ale wszystkie komunikaty o błędach.Jeśli naprawdę chcesz zachować inne możliwe błędy, takie jak zbyt wiele przeskoków w dowiązaniu symbolicznym, ale nie te, którym odmówiono zezwolenia, prawdopodobnie będziesz musiał szybko zgadywać, że nie masz wielu plików o nazwie „odmowa uprawnień” i próbuj:
Jeśli chcesz filtrować tylko standardowy błąd, możesz użyć bardziej skomplikowanej konstrukcji:
I / O przekierowania na
find
polecenia jest następująca:2>&1 > files_and_folders |
. Potok przekierowuje standardowe wyjście dogrep
polecenia i jest stosowane najpierw.2>&1
Wysyła standardowy błąd w tym samym miejscu co standardowe wyjście (rury).> files_and_folders
Wysyła standardowe wyjście (ale nie błąd standardowy) do pliku. W efekcie komunikaty zapisywane z błędem standardowym są przesyłane w dół potoku, a zwykłe wyjściefind
jest zapisywane w pliku.grep
Filtry standardowe wyjście (można zdecydować jak selektywne chcesz go mieć, a może trzeba zmienić pisownię w zależności od kraju i O / S) i ostateczna>&2
oznacza, że pozostałe komunikaty o błędach (zapisane na standardowe wyjście) ponownie przechodzą w standardowy błąd. 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ę przy standardowym błędzie.Istnieje nieskończona liczba odmian tego tematu, w zależności od tego, co chcesz zrobić. Działa to na każdym wariancie Uniksa z dowolną pochodną powłoki Bourne'a (Bash, Korn,…) i dowolną wersją zgodną z POSIX
find
.Jeśli chcesz dostosować się do konkretnej wersji
find
posiadanej w systemie, mogą być dostępne alternatywne opcje.find
W szczególności GNU ma niezliczone opcje niedostępne w innych wersjach - zobacz aktualnie akceptowaną odpowiedź na jeden taki zestaw opcji.źródło
2>/dev/null
, bez miejsca!2>
To jedno urządzenie bez jakichkolwiek przerw; możesz mieć spację między nim a nazwą pliku. Podobnie z innymi przekierowaniami, takimi jak2>&1
(który przekierowuje standardowy błąd w to samo miejsce, w którym idzie standardowe wyjście), lub2>&-
który zamyka standardowy błąd itp. Zobacz pozostałe przekierowania, aby uzyskać szczegółowe informacje. (Powyższy kod jest ogólną powłoką podobną do POSIX, a nie specyficzną dlabash
.)Posługiwać się:
lub bardziej ogólnie
Współpracuje z: find (GNU findutils) 4.4.2. Tło:
-readable
Test mecze plików czytelny.!
Operator zwraca true, gdy test jest fałszywe. I! -readable
dopasowuje nieczytelne katalogi (i pliki).-prune
Działanie nie zejść do katalogu.! -readable -prune
można przetłumaczyć na: jeśli katalog nie jest czytelny, nie schodź do niego.-readable
Badanie uwzględnia list kontroli dostępu i innych artefaktów uprawnieniami którym-perm
ignoruje testowe.Zobacz także
find
(1) stronę, aby uzyskać więcej informacji.źródło
-o
:find . ! -readable -prune -o -name '*.txt'
find
nie obejmuje-readable
jako opcji; nie dotyczy to równieżfind
BSD, a tym samym Mac OS X (nie jestem pewien co do innych systemów). Tak więc, jeśli maszfind
gwarancję GNU , działa to świetnie, ale nie jest oczywiste, jak to dostosować, jeśli nie możesz zagwarantować, że system mafind
zainstalowany GNU . (Będzie działał dobrze w systemie Linux; może, ale nie musi działać gdzie indziej.)find . ! -readable -prune -o -name '*.txt'
wydaje się, że nie działa na Ubuntu 14.04 przy użyciu find 4.2.2. Wygląda na to, że wchłania-name
. Z jakiegoś dziwnego powodu odnoszę sukcesfind . \( ! -readable -prune \) -o -name '*.txt' -print
Jeśli chcesz rozpocząć wyszukiwanie od roota „/”, prawdopodobnie zobaczysz coś takiego jak:
To z powodu pozwolenia. Aby rozwiązać ten problem:
Możesz użyć polecenia sudo:
Pyta o hasło superużytkownika, po wpisaniu hasła zobaczysz wynik, który naprawdę chcesz. Jeśli nie masz uprawnień do korzystania z polecenia sudo, co oznacza, że nie masz hasła superużytkownika, najpierw poproś administratora systemu o dodanie Cię do pliku sudoers.
Możesz użyć przekierowania Standardowego wyjścia błędu z (Generalnie wyświetlanie / ekran) do jakiegoś pliku i unikać wyświetlania komunikatów o błędach na ekranie! przekieruj do specjalnego pliku / dev / null:
Możesz użyć przekierowania Standardowego wyjścia błędu z (Generalnie wyświetlanie / ekran) na Standardowe wyjście (Generalnie wyświetlanie / ekran), a następnie potokować za pomocą polecenia grep z parametrem -v „invert”, aby nie wyświetlać linii wyjściowych, dla których „Odmowa dostępu” pary słów:
źródło
sudo find...
Musiałem użyć:
określając nazwę tego, co chciałem znaleźć, a następnie każąc przekierować wszystkie błędy na / dev / null
spodziewaj się, że jest to lokalizacja oczekiwanego programu, którego szukałem.
źródło
expect
. Zamiast tegoexpect
jest po prostu nazwą pliku, który to polecenie spróbuje znaleźć.Rura
stderr
do/dev/null
stosując 2> / dev / nullfind . -name '...' 2>/dev/null
źródło
find . -name '...' -print 2>/dev/null
Możesz także użyć predykatów
-perm
i,-prune
aby uniknąć zejścia do nieczytelnych katalogów (zobacz też Jak usunąć instrukcje wydruku „odmowa uprawnień” z programu znajdującego? - Unix i Linux Stack Exchange ):źródło
-perm -g+r,u+r,o+r
po prostu dopasowuje pliki, które mają uprawnieniar
(do odczytu) ustawione dla wszystkich 3 podmiotów zabezpieczeń pliku , co nie ma bezpośredniego związku z tym, czy bieżący użytkownik może odczytać ten plik, czy nie. Może zarówno pomijać pliki, które bieżący użytkownik może odczytać, jak i dopasowywać pliki, których nie mogą.find . -type d ! \( -perm -u+r -o -perm -g+r -o -perm -o+r \) -prune -o -print
byłoby dobrym rozwiązaniem.-readable
z-perm
- patrz mój poprzedni komentarz i Rozważmy następujący przykład:echo 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=r
wydrukifile
, ponieważ jego użytkownik odczytać bit jest ustawiony, ale dotyczy on Thenobody
użytkownika, a nie bieżącego użytkownika. Bieżący użytkownik nie może odczytać tego pliku; spróbujcat file
. Zobacz także: moja odpowiedź .Przekieruj błąd standardowy. Na przykład, jeśli używasz bash na maszynie uniksowej, możesz przekierować standardowy błąd do / dev / null w następujący sposób:
źródło
Chociaż powyższe podejścia nie uwzględniają przypadku systemu Mac OS X, ponieważ Mac OS X nie obsługuje
-readable
przełącznika, w ten sposób można uniknąć błędów „odmowy zezwolenia” w danych wyjściowych. To może komuś pomóc.find / -type f -name "your_pattern" 2>/dev/null
.Jeśli używasz innego polecenia
find
, na przykład, aby znaleźć rozmiar plików określonego wzorca w katalogu2>/dev/null
, nadal działałby, jak pokazano poniżej.find . -type f -name "your_pattern" -exec du -ch {} + 2>/dev/null | grep total$
.Zwróci to całkowity rozmiar plików o danym wzorze. Uwaga
2>/dev/null
na końcu polecenia find.źródło
2>/dev/null
. Czy możesz wyjaśnić tę część-exec du -ch {} + 2>/dev/null | grep total$
.-exec
opcją, aby podjąć dalsze działania na plikach lub katalogach znalezionych przezfind
polecenie.du -ch file_pattern
oblicza rozmiar każdego dopasowanego pliku,file_pattern
a ostatni wiersz tego wyniku jest sumą wszystkich plików, które pasowałyfile_pattern
. Zobacz stronę podręcznika dladu
.grep total
po prostu filtruje linię, która wyodrębnia sumę całkowitą (która jest ostatnią linią).Błędy te są drukowane na standardowe wyjście błędów (fd 2). Aby je odfiltrować, po prostu przekieruj wszystkie błędy do / dev / null:
lub najpierw połącz stderr i stdout, a następnie wytłumacz te konkretne błędy:
źródło
Prosta odpowiedź:
find . > files_and_folders 2>&-
2>&-
zamyka (-
) standardowy deskryptor pliku błędów (2
), więc wszystkie komunikaty o błędach są wyciszane.1
jeśli wPermission denied
przeciwnym razie zostaną wydrukowane jakiekolwiek błędySolidna odpowiedź dla GNU
find
:find . -type d \! \( -readable -executable \) -prune -print -o -print > files_and_folders
Przekazać dodatkowe opcje
find
, które-prune
(zapobieganie schodząc do), ale wciąż-print
dowolnego katalogu ( ), która nie ( ) mają zarówno i uprawnienia, lub ( ) każdy inny plik.-type
d
\!
-readable
-executable
-o
-print
-readable
a-executable
opcje to rozszerzenia GNU, nie będące częścią standardu POSIXPermission denied
' w przypadku nieprawidłowych / uszkodzonych plików (np. Zobacz raport o błędach wpływający na systemy plików zamontowane w kontenerze przy użyciulxcfs
<v2.0.5)Solidna odpowiedź, która działa z każdym kompatybilnym 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żyj potoku, aby przekazać standardowy strumień błędów
grep
, usuwając wszystkie wiersze zawierające'Permission denied'
ciąg.LC_ALL=C
ustawia locale POSIX stosując zmienną środowiska ,3>&2 2>&1 1>&3
a3>&2 2>&1
powielone deskryptory plików do rury strumień standardowego błędugrep
i[ $? = 1 ]
zastosowania[]
odwrócić przez zwrócony kod błędugrep
do w przybliżeniu pierwotnej zachowaniefind
.'Permission denied'
błędy wynikające z przekierowania wyjścia (np. Jeślifiles_and_folders
sam plik nie jest zapisywalny)źródło
-perm
rozwiązanie oparte na wartości nie jest warte przedstawienia, ponieważ bardziej fundamentalnie niż sugeruje to cytat, robi coś innego niż zamierzone: jest to test skoncentrowany wyłącznie na plikach , odnoszący się do właściciela pliku i grupa, z których żadna nie ma żadnych gwarantowanych relacji z użytkownikiem wywołującym polecenie (zobacz moją odpowiedź . Wygląda na to, że twoje poprawione rozwiązanie GNU nie łapie teraz błędów odmowyecho 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=r
wypisujefile
, ponieważ jego bit odczytu użytkownika jest ustawiony, ale odnosi się donobody
użytkownika , nie bieżący użytkownik. Bieżący użytkownik nie może odczytać tego pliku; spróbujcat file
.-perm
nie działa na określenie aktualnych uprawnień użytkownika. Usunąłem tę alternatywę z tej odpowiedzi.Aby uniknąć tylko za pozwoleniem zaprzeczył ostrzeżenia, powiedz znaleźć ignorować nieczytelne pliki przez przycinanie ich wyszukiwania. Dodaj wyrażenie jako OR do swojego znaleziska, takie jak
Mówi się głównie o (dopasuj nieczytelny plik i przyciąć go z listy) LUB (dopasuj nazwę jak * .jbd i wyświetl ją [za pomocą ls]) . (Pamiętaj, że domyślnie wyrażenia są AND połączone razem, chyba że użyjesz -lub.) Potrzebujesz -ls w drugim wyrażeniu, bo w przeciwnym razie find może dodać domyślną akcję, aby pokazać jedno z pasujących elementów, które pokaże również wszystkie nieczytelne pliki .
Ale jeśli szukasz prawdziwych plików w swoim systemie, zwykle nie ma powodu, aby szukać w / dev, który ma wiele wielu plików, więc powinieneś dodać wyrażenie wykluczające ten katalog, takie jak:
Więc (dopasuj nieczytelny plik i przycinaj z listy) LUB (dopasuj ścieżkę / dev i przycinaj z listy) LUB (dopasuj plik jak * .jbd i wyświetl go) .
źródło
posługiwać się
Jest głupi (ponieważ podnosisz wyniki wyszukiwania) i nie jest bezpieczny, ale jest o wiele krótszy do napisania.
źródło
sudo
. Ryzykujesz, że cały system zostanie pomieszany przez błąd wfind
lub złośliwą wersję, lub nieprawidłowe wywołanie, które zapisuje coś nieoczekiwanie, co nie mogłoby się zdarzyć, gdybyś uruchomił to z normalnymi uprawnieniami.Żadna z powyższych odpowiedzi nie działała dla mnie. Cokolwiek znajduję w Internecie, koncentruje się na: ukrywaniu błędów. Brak poprawnie obsługuje kod powrotu / kod zakończenia procesu. Używam poleceń find w skryptach bash, aby zlokalizować niektóre katalogi, a następnie sprawdzić ich zawartość. Oceniam powodzenie komendy za pomocą kodu wyjścia: wartość zero działa, w przeciwnym razie kończy się niepowodzeniem.
Odpowiedź podane powyżej przez Michaela Brux działa czasami. Ale mam jeden scenariusz, w którym się nie udaje! Odkryłem problem i sam go naprawiłem. Muszę przycinać pliki, gdy:
Zobacz kluczową kwestię tutaj: ORAZ / LUB. Jedna dobra sugerowana sekwencja warunków, którą przeczytałem, to:
To nie zawsze działa. Oznacza to, że suszona śliwka jest uruchamiana, gdy mecz jest:
Ta sekwencja wyrażeń kończy się niepowodzeniem, gdy przyznany jest dostęp do odczytu, ale nie ma dostępu do wykonania.
Po kilku testach zdałem sobie z tego sprawę i zmieniłem rozwiązanie skryptu powłoki na:
Kluczem tutaj jest umieszczenie „nieprawdziwego” wyrażenia łączonego:
W przeciwnym razie nie ma pełnego dostępu, co oznacza: przycinanie. Okazało się to dla mnie skuteczne w jednym scenariuszu, w którym poprzednie sugerowane rozwiązania zawiodły.
Poniżej zamieszczam szczegółowe informacje techniczne dotyczące pytań w sekcji komentarzy. Przepraszam, jeśli szczegóły są nadmierne.
źródło
nice
ifind $HOME -maxdepth 5 -follow ...
?${m_find_name}
) i zawiera kilka opcji, które nie mają na pytanie (nice
,/home*
,-maxdepth 5
,-follow
). Dodałem odpowiedź, która rozwiązuje bardziej konkretnie kwestię „filtrowania katalogów czytelnych, ale niewykonywalnych” bardziej zwięźle, przy jednoczesnym zachowaniu ogólnego przeznaczenia.Możesz użyć grep -v invert-match
lubię to:
Powinien do magii
źródło
- = Dla MacOS = -
Stwórz nowe polecenie używając aliasu: po prostu dodaj w linii ~ / .bash_profile:
aw nowym oknie terminalu możesz to nazwać:
źródło
Jeśli używasz CSH lub TCSH, oto rozwiązanie:
Jeśli chcesz wyprowadzać dane do terminala:
Jednak, jak opisuje FAQ „csh-whynot”, nie powinieneś używać CSH.
źródło