Fórum Root.cz
Hlavní témata => Software => Téma založeno: Ħαℓ₸℮ℵ ␏⫢ ⦚ 16. 03. 2024, 21:20:45
-
Nejdou mi složitější příkazy:
root@a:/proc # find -type d -maxdepth 1 -exec echo a{} \;
a{}
a{}
a{}
root@a:/proc # find -type d -maxdepth 1 -exec "date; date;" \;
find: exec date; date;: No such file or directory
find: exec date; date;: No such file or directory
root@a:/proc # find -type d -maxdepth 1 -exec echo 1 \; echo 2 \;
find: bad arg 'echo'
root@a:/proc # find -type d -maxdepth 1 -exec echo "{}" \; cat {}/comm \;
find: bad arg 'cat'
Cíl je jasný, chci aspoň takové minimum jako pro každý záznam vypsat něco jako echo {} ; echo " ..."; cat {}/comm což bude vypadat jako
123 : bash
3939 systemd
to to opravdu takhle jednoduše nejde???
-
Ale jde:
$ find -type d -maxdepth 1 -exec echo "a{}" \;
a.
a./.trash
$ find -type d -maxdepth 1 -print -exec date \; -exec date \;
.
So 16. března 2024, 22:16:50 CET
So 16. března 2024, 22:16:50 CET
./.trash
So 16. března 2024, 22:16:50 CET
So 16. března 2024, 22:16:50 CET
(print je navíc pro ukázání, že pro každý adresář vypíše datum 2x)
nebo:
find -type d -maxdepth 1 -exec sh -c "date; date;" \;
find -maxdepth 1 -type d -exec echo "{}" \; -exec cat "{}"/comm \;
-
Ještě pozor, pokud mezi jednotlivými výrazy u find není specifikovaný operátor, tak se automaticky uvažuje jako AND. Takže "expandovaný" zápis je pak takhle
find -maxtedpth 1 -a -type -d -a -exec...
A za pravdivost výrazu u -exec je považován retval - 0 true, zbytek false. Takže například, pokud nemáš ty soubory comm všude, tak další výraz se neprovede (shcválně prohozeno pro demonstraci:
find -type d -maxdepth 1 -exec cat "{}"/comm \; -exec echo "A: {}" \;
Výsupem bude pro každý adresář toto: Pokud soubor "{}"/comm existuje, tak jeho obsah následován řádkem "A: <jméno adresáře>". Pokud soubor "{}/comm" neexistuje, tak se nic nevypíše.
provedení všech příkazů se dá „vynutit“ použitím operátoru OR (-o):
find -type d -maxdepth 1 \( -exec cat "{}"/comm \; -o -exec echo "A: {}" \; \)
Závorky vytváří skupinu, takže logický výraz je:
type AND maxdepth AND ( exec cat OR exec echo )
-
(teď jsem si uvědomil, že find používá líné vyhodnocování výrazů... Takže
find ... \( -exec A \; -o -exec B \; \)
není zcela správné: pokud A skončí bez chyby, tak B už se neprovede, protože výraz už platí. Je potřeba použít
find ... \( -exec A \; , -exec B \; \)
"," říká, že oba výrazy budou provedeny.
-
Tak, v backende (v C) sú dve spôsoby ako spúšťať program:
- cez system() – shellový interpret,
- cez execve() – akoby predávaš parametre pre main() iného programu.