Fórum Root.cz

Hlavní témata => Software => Téma založeno: Ħαℓ₸℮ℵ ␏⫢ ⦚ kdy 16. 03. 2024, 21:20:45

Název: Nefunguje složitější find -exec
Přispěvatel: Ħαℓ₸℮ℵ ␏⫢ ⦚ kdy 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???
Název: Re:Nefunguje složitější find -exec
Přispěvatel: mhepp kdy 16. 03. 2024, 22:20:18
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 \;
Název: Re:Nefunguje složitější find -exec
Přispěvatel: mhepp kdy 16. 03. 2024, 22:33:14
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 )
Název: Re:Nefunguje složitější find -exec
Přispěvatel: mhepp kdy 16. 03. 2024, 22:46:50
(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.
Název: Re:Nefunguje složitější find -exec
Přispěvatel: z_sk kdy 17. 03. 2024, 09:27:29
Tak, v backende (v C) sú dve spôsoby ako spúšťať program: