Jak opanować polecenie znajdowania w systemie UNIX?

11

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:

  1. Połącz katalog ćwiczeń i podłącz go do innych katalogów ćwiczeń.
  2. Użyj raczej xargs niż nieintuicyjnego polecenia exec.
  3. Użyj -exec echo {} dla zdrowia i bezpieczeństwa
  4. Średnik dwukropek jest wyjątkowy i uciekasz go, dlatego znak ucieczki jest pierwszy
  5. 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ć.

ojblass
źródło
1
Też nie pamiętam, więc po prostu wrzucam to do xargs.
rezonator
2
Jeśli jesteś zadowolony z budowania właściwego polecenia, rozważ uruchomienie go z + zamiast \; Będzie działał szybciej z +, ponieważ polecenie exec będzie wywoływane znacznie rzadziej.
wzzrd
wzzrd, świetna wskazówka na temat używania + zamiast \;
Daniel Lawson

Odpowiedzi:

19

Jeśli chodzi o -execskładnię, możesz zrobić jak wielu ludzi, poddać się i użyć xargs:

find . -type f | xargs chown username

(lub wersja z plikami ze spacjami i innymi nonsensami w nich)

find . -type f -print0 | xargs -0 chown username

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 -execi musisz uciec od średnika, ponieważ ma on specjalny co znaczy bash. 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:

find . -type f -exec echo chown username {} \;

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. :)

chaos
źródło
1
+! do ćwiczenia „echa” na sucho. Zawsze używam tego do dużej zmiany
Steve Folly
3

Dziwię się, że nikt jeszcze nie wspomniał o następującej opcji:

find . -type f -ok chown username {} \;

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:

find . -type f -exec chown username {} \+

Pamiętaj, że + zwykle nie wymaga ucieczki, ale i tak warto przyzwyczaić się do tego.

Kamil Kisiel
źródło
Czy potrafisz wyjaśnić naturę znaku plus ... co on właściwie robi? Czy powłoka przetwarza to czy polecenie. Myślę, że zamierzam pobrać kod źródłowy dla gnu-find, ponieważ jest to interesujący temat.
ojblass
find przetwarza to. Przeczytaj, aby dowiedzieć się więcej o tej opcji.
Kamil Kisiel
3

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:

for i in {1..100}; do touch "$i"; done
Kyle Brandt
źródło
Dziwny katalog ćwiczeń to coś, czego nigdy nie rozważałem.
ojblass
1

Możesz także łączyć wyrażenia find z operatorami „i” i „lub”. i jest niejawny:

find . -type f -name "plainfile" ...

jest taki sam jak

find . -type f -and -name "plainfile" ...

Operator lub może zmniejszyć listę 4 poleceń do 2:

find . -type d -or -type f ...

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:

find . -type d -or -type f -exec chown username:usergroup '{}' \;
Steve Folly
źródło
Co znajduje się w -lub biznesie. [Sic]
ojblass
@ojblass: find łączy wyrażenia za pomocą „i” lub „lub”, domyślnie jeśli nie podano ani „-and” ani „-or”, „-and” jest używane niejawnie. Więc wpisz „find -type d -type f” niczego nie znajdzie, ponieważ nic nie jest katalogiem i plikiem.
Steve Folly
0

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.

Garry Harthill
źródło
0

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
0

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

find /path/to/dir -name whatever

upewnij się, że dane wyjściowe wyglądają poprawnie, a następnie uruchom moje polecenie na tej liście.

chown user:group `find /path/to/dir -name whatever`
inne
źródło
Idealny przykład tego, jak „nie” robić rzeczy. Nazwy plików ze spacjami.
Ian Kelling
Tak, to potencjalny problem, który być może powinienem był uznać. Jednak moim celem było przeczytanie wyniku wyszukiwania przed wykonaniem czegokolwiek, w którym zauważyłeś spacje lub inne szaleństwo nazw plików.
theotherreceive
0

W przypadku niektórych powłok (nie bash) należy uciec {}, aby uzyskać prawidłowe zachowanie.

\{\} or '{}'

find manual jest dobry do opanowania find.

Ian Kelling
źródło
Nie ty nie; znajdź działa dobrze z {}, ponieważ są. Są one częścią polecenia find: są tokenem, który zostaje zastąpiony przez wynik polecenia find. Mają tylko znaczenie w bash podczas definiowania funkcji lub wywoływania zmiennych, więc możesz ich użyć tak, jak w pierwotnym pytaniu.
wzzrd
To ze strony podręcznika. Zaktualizowałem, aby powiedzieć, że nie dotyczy bash.
Ian Kelling
0

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.

Chris
źródło
Nie sądzę, że jest to platforma wieloplatformowa. Również nie powiodło się z 247 KB plików, co wykazało moje środowisko ćwiczeń. Nie jestem pewien dlaczego.
ojblass
Myślę, że znalazłeś błąd bardziej niż problem z siecią krzyżową. Która wersja i jaki jest status wyjścia, gdy się nie powiedzie? O ile mogę powiedzieć, po raz pierwszy powstał we wczesnych wersjach bsd; jest zdecydowanie w sunos 5.3 i ultrix i irix. Ile przetwarza, zanim ulegnie awarii?
Chris
Masz rację, działa na AIX 5.3, AIX 5.2, ale nie na AIX 4.3, NCR, HP 11, HP 10.20 lub moich dystrybucjach DSL. We wszystkich przypadkach wydaje się, że nie działa przy lub w pobliżu plików 60k.
ojblass