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:
Kód: [Vybrat]
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

  • ***
  • 159
    • Zobrazit profil
    • E-mail
Re:Nefunguje složitější find -exec
« Odpověď #1 kdy: 16. 03. 2024, 22:20:18 »
Ale jde:

Kód: [Vybrat]
$ find -type d -maxdepth 1 -exec echo "a{}" \;
a.
a./.trash

Kód: [Vybrat]
$ 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:

Kód: [Vybrat]
find -type d -maxdepth 1 -exec sh -c "date; date;" \;

Kód: [Vybrat]
find -maxdepth 1 -type d -exec echo "{}" \; -exec cat "{}"/comm \;

mhepp

  • ***
  • 159
    • Zobrazit profil
    • E-mail
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

Kód: [Vybrat]
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:

Kód: [Vybrat]
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):

Kód: [Vybrat]
find -type d -maxdepth 1 \( -exec cat "{}"/comm \;  -o -exec echo "A: {}" \; \)

Závorky vytváří skupinu, takže logický výraz je:

Kód: [Vybrat]
type AND maxdepth AND ( exec cat OR exec echo )

mhepp

  • ***
  • 159
    • Zobrazit profil
    • E-mail
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

Kód: [Vybrat]
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

Kód: [Vybrat]
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.