Nefunguje složitější find -exec

Nefunguje složitější find -exec
« 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???


mhepp

  • ***
  • 224
Re:Nefunguje složitější find -exec
« Odpověď #1 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 \;

mhepp

  • ***
  • 224
Re:Nefunguje složitější find -exec
« Odpověď #2 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 )

mhepp

  • ***
  • 224
Re:Nefunguje složitější find -exec
« Odpověď #3 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.

z_sk

Re:Nefunguje složitější find -exec
« Odpověď #4 kdy: 17. 03. 2024, 09:27:29 »
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.