V této ukázce použiji sh -c 'echo first; false'
(nebo true
) pro prvních -exec
. To poskytne určitý výstup a také efekt vybraného výstupního kódu. Poté echo second
bude použit pro druhý. Předpokládejme, že v aktuálním adresáři je jeden soubor.
$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
Skutečný příkaz tohoto typu by vypadal takto:
find . -type f \( -exec command1 \; -false -o -exec command2 \; \)
Ve druhé sadě seskupují uvozené závorky dva -exec
doložky. -false
mezi nimi vynutí testovací stav na "false" a -o
způsobí další výraz (druhý -exec
), který bude vyhodnocen kvůli -false
.
Od man find
:
expr1 expr2
Dva výrazy v řadě jsou považovány za spojené s implikovaným "a"; výraz expr2 se nevyhodnocuje, pokud je výraz expr1 nepravdivý.expr1 -a expr2
Stejné jako expr1 expr2.expr1 -o expr2
Nebo; výraz expr2 se nevyhodnocuje, pokud má výraz výraz1 hodnotu true.
Pokud vám nezáleží na tom, aby cmd1 mohl zabránit spuštění cmd2 kvůli kódu chyby 0
:
find . -exec cmd1 \; -exec cmd2 \;
Jediný spolehlivý způsob, jak zajistit, aby oba příkazy vždy spouštěly, je mít find
vyvolejte shell, který následně spustí příkazy v pořadí:
find . -exec bash -c 'cmd1; cmd2' filedumper {} \;
Pokud vám nevadí vytvořit skript, který dělá cmd1 a cmd2, pak je to právě toto:
find . -exec myscript {} \;
nebo
find . -exec myscript {} +
Použijte \; nebo + v závislosti na tom, zda myscript dokáže zpracovat více než jeden soubor najednou (zvýší se, pokud jsou v názvech souborů mezery atd.).
Vložit to, co jste dělali, do scénáře, podle mých zkušeností téměř vždy stálo za to. Pokud to musíte udělat jednou, budete to muset udělat znovu.
Ale skvělý trik je vložit nález dovnitř skript:
if [ $# -gt 0 ]; then
for each; do
touch $each
done
else
find . -exec $0 {} +
fi
Potom myscript funguje na libovolných souborech, které zadáte jako argumenty, se kterými má pracovat, ale pokud mu žádné argumenty nezadáte, spustí find z aktuálního adresáře a pak se zavolá na nalezené soubory. To obchází skutečnost, že find -exec nemůže volat funkce shellu, které jste definovali ve skriptu.