Myślę, że jestem dość zaawansowany w używaniu find, ale za każdym razem, gdy go używam, nie mogę pamiętać o metodzie zamknięcia opcji -exec przez całe życie. Spędzam dużo czasu czytając za każdym razem, gdy go używam. Czy po prostu nie używam jej wystarczająco dużo lub oczekuję od siebie zbyt wiele? Zacznijmy od typowego przykładu, który mnie frustruje.
Struktura katalogów zawiera pliki ze wszystkimi nieprawidłowymi uprawnieniami ukryte pliki, linki symboliczne itp. Chcę zmienić właściciela na rozsądną wartość
find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;
(Wybacz mi, jeśli zakończenie jest odwrócone ... Spojrzałem na to godzinę temu i nadal nie jestem pewien)
Ale boję się go uruchamiać z powodu wierzchowców, dowiązań symbolicznych itp. Zrobiłem ostateczny głupek z chmod. * I miałem go wcześniej na sobie. Wiem, że -xdev zrezygnuje z przekraczania partycji, ale nie jestem pewien, co stanie się z plikami znajdującymi się w katalogach, które są dowiązaniami symbolicznymi.
Jak więc opanować tę bestię, która może zabijać kluczowe pliki?
Zaktualizuj przycinanie najlepszych sugestii poniżej i podsumowując:
- Połącz katalog ćwiczeń i podłącz go do innych katalogów ćwiczeń.
- Użyj raczej xargs niż nieintuicyjnego polecenia exec.
- Użyj -exec echo {} dla zdrowia i bezpieczeństwa
- Średnik dwukropek jest wyjątkowy i uciekasz go, dlatego znak ucieczki jest pierwszy
- Komenda -or może pomóc ci łączyć kryteria wyboru.
Jestem trochę zdezorientowany co do print0, ale xargs zawsze był trochę na trudnej do zrozumienia na pierwszy rzut oka praktyce, której staram się unikać.
źródło
Odpowiedzi:
Jeśli chodzi o
-exec
składnię, możesz zrobić jak wielu ludzi, poddać się i użyćxargs
:(lub wersja z plikami ze spacjami i innymi nonsensami w nich)
Lub, aby spróbować zapamiętać właściwą rzecz dotyczącą średnika, musisz wywiercić w głowie to, że używasz średnika do zakończenia uruchomionego polecenia
-exec
i musisz uciec od średnika, ponieważ ma on specjalny co znaczybash
. Dlatego jest to średnik odwrotny. Wygląda na to, że{}
część zastępcza jest w porządku.Jeśli chodzi o zabijanie plików i tak dalej, jeśli prowadzisz coś dużego i niebezpiecznego, o czym mówisz, najpierw wykonaj następujące czynności:
i przejrzyj wyniki. Jest to w zasadzie „bieg próbny”, w którym widzisz polecenia, które uruchomiłby, gdybyś na to pozwolił. Zdecydowanie dobra praktyka. Nie pomoże to w
.*
rozwiązaniu problemu, ale teraz już tego nie robisz. :)źródło
Dziwię się, że nikt jeszcze nie wspomniał o następującej opcji:
Ta składnia potwierdzi polecenie przed jego wykonaniem. Działa najlepiej, jeśli spodziewasz się, że dopasowanie będzie względnie małą liczbą plików, ponieważ będzie monitował o każdy z nich.
Niektóre odpowiedzi wspominają
xargs
, ale GNU uważa, że również nie jest to konieczne:Pamiętaj, że + zwykle nie wymaga ucieczki, ale i tak warto przyzwyczaić się do tego.
źródło
Po to jest człowiek: Trudno zapamiętać różne rzeczy, dlatego polecenie * nix zawiera strony podręcznika man. Można po prostu zawsze sprawdzić sekcję działania strony man dla przypomnienia o składni:
man find
. Mimo że strony podręcznika mogą wydawać się niezbyt przyjazne, gdy umiesz je dobrze czytać, są bardzo przydatne.Stwórz Front-End lub Wrapper: Kiedy chciałem być lepszy w GNU find, napisałem interfejs GUI dla find, który generuje polecenia find z pythonem, polaną i pygtk. To dobre ćwiczenie, jeśli chcesz naprawdę dobrze je poznać.
Prowadź katalog ćwiczeń: Na koniec zawsze mam katalog „złom” w moim domowym katalogu do grania potężnymi poleceniami, gdy coś takiego jak „echo” go nie wycina. Możesz użyć rozszerzenia powłoki, aby szybko utworzyć kilka plików za pomocą czegoś takiego:
źródło
Możesz także łączyć wyrażenia find z operatorami „i” i „lub”. i jest niejawny:
jest taki sam jak
Operator lub może zmniejszyć listę 4 poleceń do 2:
I na koniec, nie związane z wyszukiwaniem, ale chown może również ustawić grupę. Tak więc, radząc sobie ze spacjami w nazwach, kończymy na:
źródło
Zamykając myślę tylko o użyciu; jak w przypadku wielu języków programowania, a następnie unikania tego. Pamiętaj tylko, że trzeba uciec i przychodzi do ciebie dość łatwo.
źródło
W zależności od używanej wersji znalezienia dostępne są różne opcje, które mogą ci pomóc. Znalezienie GNU jest prawdopodobnie najpotężniejsze i może ci pomóc z drugim (domyślnym) pytaniem
Na przykład - domyślnym zachowaniem nie jest usunięcie dowiązań symbolicznych, ale można to zmienić; a opcja -mount przestaje przechodzić przez punkty montowania
Zajrzyj na lokalne strony podręcznika
źródło
Niektórzy twierdzą, że opcja xargs jest szybsza niż opcja -exec, ponieważ nie wykona polecenia raz dla każdego pliku, ale nie martwiłbym się tym o nic poza ogromnymi zadaniami zajmującymi mało trywialny czas.
Osobiście zwykle uruchamiam find bez exec
upewnij się, że dane wyjściowe wyglądają poprawnie, a następnie uruchom moje polecenie na tej liście.
źródło
W przypadku niektórych powłok (nie bash) należy uciec {}, aby uzyskać prawidłowe zachowanie.
find manual jest dobry do opanowania find.
źródło
Zanim zrobisz cokolwiek takiego, upewnij się, że katalog, w którym uruchamiasz to polecenie, nie znajduje się w tym samym systemie plików, co / usr lub / etc. (w przeciwnym razie, jeśli mam twardy link do / etc / passwd lub do / bin / sh w moim katalogu domowym, właśnie dałeś mi ich własność i jako efekt uboczny mam teraz maszynę).
Jeśli chcesz ponownie przeglądać katalog i przeglądać wszystkie pliki / katalogi, to proste
chown -Rh użytkownik: użytkownik grupa użytkowników /
zrobię to. Upewnij się , że używasz -h lub chown będzie podążał za dowiązaniami symbolicznymi.
źródło