GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu provést více příkazů při použití funkce find?

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.


Linux
  1. Jak poslat Stdout do více příkazů?

  2. Jak přejmenovat více souborů pomocí funkce Najít?

  3. Linux – Jak najít procesy pomocí sériového portu?

  1. Jak najít více řetězců v souborech?

  2. Jak spouštět příkazy v Gnuplot pomocí skriptu Shell?

  3. Výuka Unix Sed:Jak provádět více příkazů Sed

  1. Jak nakonfigurovat Nginx pro spouštění PHP pomocí PHP-FPM

  2. Jak mohu provést řadu příkazů v subshell bash jako jiný uživatel pomocí sudo?

  3. Jak kopírovat více souborů současně pomocí scp