Coś takiego jest tym, czego szukam, ale mój kod nie działa, bez względu na to, jak uciekam {}
i+
;
find ./ -maxdepth 1 -type d -name '.*' -exec \
find {} -maxdepth 1 -type f -name '*.ini' -exec \
md5sum \{\} \\; \;
Po zobaczeniu tego pytania dotyczącego systemu Unix - i - Linux stwierdziłem, że poniższy kod działa, ale nie jest zagnieżdżaniem znalezionego jako takiego i podejrzewam, że jest lepszy sposób na wykonanie tego konkretnego zadania.
find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
find "$x" -maxdepth 1 -type f -name "*.ini" \
-exec md5sum \{\} \;; \
done' _ {} \+
Czy istnieje jakiś sposób na zagnieżdżanie się find -exec
bez potrzeby wywoływania powłoki (jak wyżej), z wszystkimi jej zawrotnymi cytatami i ograniczeniami ucieczki?
Czy można to zrobić bezpośrednio za pomocą jednego polecenia find, używając kombinacji wielu jego parametrów?
text-processing
find
filenames
Peter.O
źródło
źródło
find
, ale jeślifind
nie możesz tego zrobić, to dlaczego jestfind
tak czczony (?) Jako narzędzie- do użycia przy wyszukiwaniu plików? ... Kolejno stwierdziłem, żefind ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+
działa dobrze w mojej sytuacji (odniesienie jw013-prune
doprowadziło mnie do tego na stronie podręcznika), ale zastanawiam się, czy jest to solidna metoda (ogólnie). Nigdy tak naprawdę nie korzystałemfind
(w mniej niż rok z Linuksa), ponieważlocate
zrobiłem prawie wszystko, czego potrzebuję, więc jest to nieznane terytorium.-path
Test jest dokładnie to, co miałem zamiar zaproponować. Dzięki temu powinieneś być w stanie zrobić wszystko, co chcesz (przepraszam za skojarzenie Ace Of Base;))Odpowiedzi:
Spróbowałbym użyć jednego znaleziska, takiego jak:
a nawet (wcale
find
, po prostu globbing powłoki)chociaż nie ma tego
-type f
wyboru, więc działa tylko wtedy, gdy nie masz żadnych katalogów / nie-plików kończących się na.ini
. Jeśli tak, możesz użyćco jednak straciłoby tę zaletę, że wymaga tylko jednego wywołania md5sum.
Edytować
Aby uzyskać ogólną i bezpieczną metodę łączenia
find
, możesz zrobić coś takiegoźródło
-f
(f?), A następnie kolejny błąd z-execdir
… Kiedy zamieniam -execdir na -exec i / lub również zastępuję md5sum drukowaniem, nie dostaję nic…find
zależy mi na tym, jak to zrobić ... Nie chodzi o to, że chcę tylko rozwiązać ten przykład, szukam wglądu w sposoby find-fu .. , może jest więcej puchu niż fu w znalezieniu ... (nie wiem, bo właściwie nigdy go nie użyłem), i to jest pierwsza sytuacja, w której naprawdę chciałem go użyć (właściwie do plików graficznych) i -exec funkcja, o której tyle słyszałem, wydaje się nie być tak potężna, jak jej rep (?) nawiązuje do ... (+1 dla alternatyw, chociaż) .. ale twójfind
przykład po prostu nie działa (wciąż )find
polecenia: ...find: The relative path
~ / bin 'jest zawarty w zmiennej środowiskowej PATH, co jest niepewne w połączeniu z akcją -execdir znajdującą. Proszę usunąć ten wpis z $ PATH` .... Więc może to zadziała, ale muszę powiedzieć, że próbowałem pozbyć się tego ~ / bin już teraz ... Będę musiał wziąć więcej poważne spojrzenie na to ... nie wiem, gdzie to ustawiłem ... żadnych pomysłów, gdzie może się czaić;~/bin
na mojej drodzefind
docenia się najlepiej w sytuacjach, których nie da się zrobić wyłącznie za pomocą globusów, ale ponieważ takie sytuacje są rzadkie, zwykle nie muszę dużo szukać.Twój pierwotny problem nie wymaga rekurencyjnego wywoływania, ale przypuszczam, że nie o to chodziło.
Uważam, że nie można wywoływać funkcji wyszukiwania rekurencyjnie tak, jak chcesz.
Poniższe polecenie nie wywołuje rekurencyjnie find (lub zagnieżdżania, jakkolwiek się nazywa), ale czy nie możesz po prostu wziąć zestawu wyników pierwszego znalezienia i podać go drugiemu? Tak instynktownie zrobiłbym:
Możesz także użyć
xargs
do wykonania drugiego wyszukiwania.Aktualizacja:
Chciałem dodać, że ponieważ większość narzędzi systemu UNIX pobiera kilka argumentów nazwy pliku zamiast jednego, zwykle można
-exec
całkowicie uniknąć :Podczas zagnieżdżania tyknięć tylnych dodajesz po prostu odwrotne ukośniki
\
przed wewnętrznymi.Jeśli wyobrażamy sobie, że
md5sum
bierze tylko jeden argument nazwy pliku, zawsze możemy zawinąć go wfor
pętlę:Zauważ, że staje się to trudniejsze, jeśli w grę
-
wchodzą nazwy plików / katalogów zaczynające się od lub zawierające spację. Narzędzia UNIX nie działają z nimi dobrze. W takim przypadku dodawania./
,--
czy konieczna jest cytaty.Oczywiście oryginalny przykład nie jest dobry, ponieważ moglibyśmy po prostu zrobić:
źródło
find
metody zawierają błąd, gdy plik / katalog zawiera spacje ...md5sum .*/*.ini
Działa dobrze ... Zaczynam odczuwać, że * Warren Young * komentowanie rzeczy, które stają się „skomplikowane”,find
dzieje się na początku gry :), ale zakładam, żefind
wychodzi to na jaw, gdy testy warunków są bardziej skomplikowane, ale jeśli chodzi o zagnieżdżanie - exec, całkiem dobrze porzuciłem pomysł, jak się wydaje, są prostsze sposoby, aby to zrobić .. (ale Perl nie jest „prosty” do mnie (jeszcze) ...Przynajmniej udało mi się zagnieździć 2 polecenia znajdowania:
Ale nie rozwiązałem problemu z wywołaniem kolejnego -exec (reż) - połączenia stamtąd.
źródło