GNU/Linux >> Znalost Linux >  >> Linux

Výstup příkazu Linux jako parametr jiného příkazu

To je to, co chcete:

find . -name myFile -exec cp /home/myuser/myFile {} ';'

Rozdělení / vysvětlení tohoto:

  • find :vyvolání příkazu find
  • . :spuštění vyhledávání z aktuálního pracovního adresáře.
  • Vzhledem k tomu, že nejsou zadány žádné příznaky hloubky, budou všechny podsložky vyhledány rekurzivně
  • -name myFile :najít soubory s explicitním názvem myFile
  • -exec :pro výsledky vyhledávání s nimi provádějte další příkazy
  • cp /home/myuser/myFile {} :kopie /home/myuser/myFile přepíše každý výsledek vrácený find do; vzpomeňte si na {} jako kam směřují jednotlivé výsledky vyhledávání.
  • ';' :používá se k oddělení různých příkazů, které mají být spuštěny po find

Existuje několik způsobů, jak to vyřešit, v závislosti na tom, zda se potřebujete starat o soubory s mezerami nebo jinými speciálními znaky v jejich názvech.

Pokud žádný z názvů souborů nemá mezery ani speciální znaky (skládají se pouze z písmen, číslic, pomlček a podtržítek), pak je následující jednoduché řešení, které bude fungovat. Můžete použít $(command) k provedení příkazu a dosadit výsledky do argumentů jiného příkazu. Shell rozdělí výsledek na mezery, tabulátory nebo nové řádky a for přiřaďte každé hodnotě $f postupně a spusťte příkaz pro každou hodnotu.

for f in $(find . -name myFile)
do
    cp something $f
done

Pokud máte mezery nebo tabulátory, můžete použít find -exec volba. Předáte -exec command args , zadáním {} kde chcete, aby byl název souboru nahrazen, a zakončení argumentů znakem ; . Musíte uvést {} a ; aby je shell neinterpretoval.

find . -name myFile -exec cp something "{}" \;

Někdy -exec není dostačující. Například v této otázce chtěli použít rozšíření parametrů Bash k výpočtu názvu souboru. Chcete-li to provést, musíte předat -exec bash -c 'your command' , ale pak narazíte na problémy s citováním s {} substituce. Chcete-li to vyřešit, můžete použít -print0 z find vytisknout výsledky oddělené prázdnými znaky (které jsou v názvech souborů neplatné) a přenést je do while read smyčka, která rozděluje parametry na hodnoty null:

find . -name myFile -print0 | (while read -d $'\0' f; do
    cp something "$f"
  done)

Roura odešle výstup jednoho programu na vstup jiného. cp nečte ze svého vstupního toku na terminálu, pouze používá argumenty na příkazovém řádku.

Buď chcete použít xargs s potrubím nebo find 's exec argument místo potrubí.

find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}

Poznámka:možnost -I {} definuje {} jako zástupný symbol můžete alternativně použít jiný zástupný symbol, pokud je v konfliktu s příkazem, který se má provést.


Linux
  1. Jak přiřadit výstup příkazu Linux k proměnné

  2. najdete příklady příkazů v Linuxu

  3. Linux příkaz find - zobrazit průběh

  1. Jak uložit výstup příkazu do souboru v Linuxu

  2. Linuxový příkaz mv

  3. Linux du command

  1. 25 jednoduchých příkladů příkazu find v Linuxu

  2. Příklady příkazů času Linux

  3. Příklady příkazů tee v Linuxu