GNU/Linux >> Linux Esercitazione >  >> Linux

Output del comando Linux come parametro di un altro comando

Questo è quello che vuoi:

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

Una ripartizione / spiegazione di questo:

  • find :invocando il comando find
  • . :avvia la ricerca dalla directory di lavoro corrente.
  • Poiché non sono specificati flag di profondità, questo cercherà in modo ricorsivo tutte le sottocartelle
  • -name myFile :trova i file con il nome esplicito myFile
  • -exec :per i risultati della ricerca, esegui comandi aggiuntivi con essi
  • cp /home/myuser/myFile {} :copia /home/myuser/myFile per sovrascrivere ogni risultato restituito da find a; pensa a {} come dove va ogni risultato di ricerca.
  • ';' :utilizzato per separare diversi comandi da eseguire dopo find

Ci sono un paio di modi per risolvere questo problema, a seconda che tu debba preoccuparti di file con spazi o altri caratteri speciali nei loro nomi.

Se nessuno dei nomi di file ha spazi o caratteri speciali (sono costituiti solo da lettere, numeri, trattini e caratteri di sottolineatura), la seguente è una soluzione semplice che funzionerà. Puoi usare $(command) per eseguire un comando e sostituire i risultati negli argomenti di un altro comando. La shell suddividerà il risultato in spazi, tabulazioni o newline e for assegna ciascun valore a $f a sua volta ed esegui il comando su ciascun valore.

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

Se hai spazi o tabulazioni, puoi usare -exec di find opzione. Superi -exec command args , inserendo {} dove vuoi che il nome del file venga sostituito e terminando gli argomenti con un ; . Devi citare il {} e ; in modo che la shell non li interpreti.

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

A volte -exec non è sufficiente. Ad esempio, in questa domanda, volevano utilizzare l'espansione dei parametri di Bash per calcolare il nome del file. Per farlo, devi passare -exec bash -c 'your command' , ma poi ti imbatterai in problemi di citazione con {} sostituzione. Per risolvere questo problema, puoi usare -print0 da find per stampare i risultati delimitati da caratteri nulli (che non sono validi nei nomi di file) e reindirizzarli a un while read ciclo che divide i parametri sui null:

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

La pipe invierà l'output di un programma all'input di un altro. cp non legge dal suo flusso di input al terminale, utilizza semplicemente gli argomenti sulla riga di comando.

Vuoi utilizzare xargs con la pipe o find exec di argomento invece di pipe.

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

Nota:opzione -I {} definisce {} come segnaposto puoi in alternativa utilizzare un altro segnaposto se è in conflitto con il comando da eseguire.


Linux
  1. Come assegnare l'output di un comando Linux a una variabile

  2. Come salvare l'output dei comandi in un file in Linux

  3. Comando Linux mv

  4. Esempi di comandi temporali di Linux

  5. trova Esempi di comandi in Linux

Comando Linux Finger per trovare i dettagli dell'utente

comando iftop in Linux

Comando lsblk in Linux

Come trovare l'indirizzo IP nella riga di comando di Linux

Trova comando in Linux/UNIX

Esempi di comandi echo Linux