Próbuję użyć find -exec z wieloma poleceniami bez powodzenia. Czy ktoś wie, czy możliwe są następujące polecenia?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
Zasadniczo próbuję wydrukować ostatni wiersz każdego pliku txt w bieżącym katalogu i wydrukować na końcu wiersza, przecinek, po którym następuje nazwa pliku.
find
podręcznika:There are unavoidable security problems surrounding use of the -exec option; you should use the -execdir option instead.
unixhelp.ed.ac.uk/CGI/man-cgi?findOdpowiedzi:
find
akceptuje wiele-exec
części polecenia. Na przykład:Zauważ, że w takim przypadku drugie polecenie zostanie uruchomione tylko wtedy, gdy pierwsze powróci pomyślnie, jak wspomniano w @Caleb. Jeśli chcesz, aby oba polecenia były uruchamiane niezależnie od ich powodzenia lub niepowodzenia, możesz użyć tej konstrukcji:
źródło
-n
niektórych innych odpowiedzi do tłumienia nowej linii generowanej przez echo, co jest przydatne, jeśli drugie polecenie generuje tylko jeden wiersz wyniku i chcesz, aby były łatwiejsze do odczytania.źródło
... -exec bash -c ...
zamiast niego... -exec sh -c ...
.{}
w kodzie powłoki. Zobacz unix.stackexchange.com/questions/156008/…Jeden z następujących:
źródło
$0
. Spróbuj tego z „foobar” zamiast „_”:find /usr/bin -name find -exec sh -c 'echo "[$0] [$1]"' foobar {} \;
- wyjście: „[foobar] [/ usr / bin / find]”.$0
zwykle jest to nazwa programu (ARGV[0]
).sh -c
był w pojedynczych cudzysłowach, a nie w podwójnych. W przeciwnym razie$1
jest w niewłaściwym zakresie.'$1'
z podwójnymi cudzysłowami, o ile unikasz zmiennej ("\$1"
). Możesz także uciec innym postaciom ("\""
).Inny sposób jest taki:
w jednej linii
multiple_cmd()
” - jest funkcjąexport -f multiple_cmd
” - wyeksportuje go, aby każda inna podpowłoka mogła go zobaczyćfind *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
” - znajdź, który wykona funkcję na twoim przykładzieW ten sposób multiple_cmd może być tak długie i tak złożone, jak potrzebujesz.
Mam nadzieję że to pomoże.
źródło
~/aaa$ acmd() { echo x \"$1\" x; }; export -f acmd; find . -exec bash -c 'acmd {}' \;
Jest prostszy sposób:
Alternatywnie:
źródło
zcat $file | wc -l
”; Gotowe działa, więc dziękuję!`
, aby użyć odwrotnych ukośników w ten sposób:\`
(ale to kolejny dobry powód, aby użyć$()
zamiast tego).Nie wiem, czy możesz to zrobić za pomocą find, ale alternatywnym rozwiązaniem byłoby utworzenie skryptu powłoki i uruchomienie go za pomocą find.
lastline.sh:
Spraw, aby skrypt był wykonywalny
Użyj
find
:źródło
Pierwsza odpowiedź Denisa to odpowiedź na problem. Ale tak naprawdę nie jest to znalezisko z kilkoma poleceniami w jednym exec, jak sugeruje tytuł. Aby odpowiedzieć jednemu exec za pomocą kilku poleceń, będziemy musieli poszukać czegoś innego do rozwiązania. Oto przykład:
Zachowaj ostatnie 10000 wierszy plików .log, które zostały zmodyfikowane w ciągu ostatnich 7 dni za pomocą 1 polecenia exec z referencjami severals {}
1) zobacz, co zrobi polecenie na jakich plikach:
2) Zrób to: (nie zaznaczaj więcej „\>”, ale tylko „>” jest to pożądane)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;
źródło
Dzięki Camilo Martinowi mogłem odpowiedzieć na powiązane pytanie:
Chciałem to zrobić
co nie działało. Jednak,
działa, więc dziękuję!
źródło
Rozszerzając odpowiedź @ Tinker,
W moim przypadku musiałem zrobić
command | command | command
wewnątrz,-exec
aby wydrukować zarówno nazwę pliku, jak i znaleziony tekst w plikach zawierających określony tekst.Byłem w stanie to zrobić z:
wynik to:
źródło
/dev/null
jako drugi argument dogrep
polecenia z jednym-exec
parametrem:find . -name config -type f -exec grep "bitbucket" {} /dev/null \;
należy użyć xargs :)
inny (działa na systemie OSX)
źródło
find
- w sytuacjach, gdy liczba pasujących plików jest zbyt duża dla wiersza poleceń.-exec
jest sposobem na obejście tego limitu. Rurociągi do mediów tracą tę korzyść.xargs -n
istnieje, aby wybrać liczbę dopasowań dla każdego wywołania.xargs -n 1 foocmd
wykona sięfoocmd {}
dla każdego meczu.find+xargs
Odpowiedź.Poniższy przykład wyszukuje wszystkie
.html
pliki i tworzy kopię z.BAK
dołączonym rozszerzeniem (np.1.html
>1.html.BAK
).Jedno polecenie z wieloma symbolami zastępczymi
Wiele poleceń z wieloma symbolami zastępczymi
To polecenie będzie również działać z plikami, które zaczynają się od myślnika lub zawierają spacje, takie jak
-my file.html
dzięki cytowaniu parametrów i--
pocp
którym sygnalizujecp
koniec parametrów i początek rzeczywistych nazw plików.źródło