Come utilizzare il comando trova in Linux

0
166
fatmawati achmad zaenuri/Shutterstock

Il comando trova di Linux è ottimo per cercare file e directory. Ma puoi anche passare i risultati della ricerca ad altri programmi per un'ulteriore elaborazione. Ti mostriamo come.

Il comando trova di Linux

Il comando trova di Linux è potente e flessibile. Può cercare file e directory utilizzando un'intera serie di criteri diversi, non solo nomi di file. Ad esempio, può cercare file vuoti, file eseguibili o file di proprietà di un particolare utente. Può trovare ed elencare i file in base ai tempi di accesso o modifica, puoi usare modelli regex, è ricorsivo per impostazione predefinita e funziona con pseudo-file come named pipe (buffer FIFO).

RELATEDCome utilizzare tutti i comandi di ricerca di Linux

Tutto è straordinariamente utile. L'umile comando trova racchiude davvero un po' di potenza. Ma c'è un modo per sfruttare quel potere e portare le cose a un altro livello. Se possiamo prendere l'output del comando trova e usarlo automaticamente come input di altri comandi, possiamo fare in modo che accada qualcosa ai file e alle directory che trovano scoperte per noi.

Il principio di reindirizzare l'output di un comando in un altro comando è una caratteristica fondamentale dei sistemi operativi derivati ​​​​da Unix. Il principio di progettazione di fare in modo che un programma faccia una cosa e la faccia bene, e aspettarsi che il suo output possa essere l'input di un altro programma, anche se non ancora scritto, è spesso descritto come “Unix filosofia.” Eppure alcune utilità di base, come mkdir, non accettano input tramite pipe.

CORRELATICome utilizzare il comando xargs su Linux

Per ovviare a questa carenza, il comando xargs può essere utilizzato per suddividere l'input in pipe e inserirlo in altri comandi come se fossero parametri della riga di comando per quel comando. Questo ottiene quasi la stessa cosa di una semplice tubazione. È ’quasi lo stesso” cosa, e non “esattamente la stessa” cosa perché possono esserci differenze impreviste con le espansioni della shell e il globbing dei nomi dei file.

Utilizzo di trova con xargs

Possiamo utilizzare trova con xargs per alcune azioni eseguite sui file trovati. Questo è un modo prolisso per farlo, ma potremmo inserire i file trovati da find in xargs , che poi li convoglia in tar per creare un file di archivio di quei file. Eseguiremo questo comando in una directory che contiene molti file PAGE del sistema della guida.

find ./-name “*.page” -type f -print0 | xargs -0 tar -cvzf page_files.tar.gz

Il comando è composto da diversi elementi.

  • trova ./-name “*.page” -digitare f -stampa0:  L'azione di ricerca verrà avviata nella directory corrente, cercando per nome i file che corrispondono a “*.page” stringa di ricerca. Le directory non verranno elencate perché gli stiamo specificando di cercare solo i file, con -type f. L'argomento print0 indica a find di non trattare gli spazi bianchi come la fine di un nome file. Ciò significa che i nomi di file contenenti spazi verranno elaborati correttamente.
  • xargs -o: gli argomenti -0 xargs per non trattare gli spazi bianchi come la fine di un nome file.
  • tar -cvzf page_files.tar.gz: questo è il comando che xargs alimenterà l'elenco dei file da find a. L'utilità tar creerà un file di archivio chiamato “page_files.tar.gz.”

Pubblicità

Possiamo usare ls per vedere il file di archivio che viene creato per noi.

ls *.gz

Il file di archivio è creato per noi. Affinché funzioni, tutti i nomi di file devono essere passati a tar in blocco, ed è quello che è successo. Tutti i nomi dei file sono stati contrassegnati alla fine del comando tar come una riga di comando molto lunga.

Puoi scegliere di eseguire il comando finale su tutti i nomi di file contemporaneamente o richiamato una volta per nome di file. Possiamo vedere la differenza abbastanza facilmente collegando l'output da xargs all'utilità di conteggio delle righe e dei caratteri wc.

Questo comando convoglia tutti i nomi di file in wc contemporaneamente. In effetti, xargs costruisce una lunga riga di comando per wc con ciascuno dei nomi di file in essa contenuti.

find . -name “*.page” -type f -print0 | xargs -0 wc

Le righe, le parole e i caratteri per ogni file sono stampato, insieme al totale di tutti i file.

Pubblicità

Se usiamo xarg‘s  -I (sostituisci stringa) opzione e definire un token di stringa sostitutivo—in ​​questo caso ” {}“—il token viene sostituito nel comando finale da ciascun nome file a turno. Ciò significa che wc viene chiamato ripetutamente, una volta per ogni file.

find . -name “*.page” -type f -print0 | xargs -0 -I “{}” wc “{}”

L'output non è ben allineato. Ogni invocazione di wc opera su un singolo file, quindi wc non ha nulla con cui allineare l'output. Ogni riga di output è una riga di testo indipendente.

Poiché wc può fornire un totale solo quando opera su più file contemporaneamente, non otteniamo le statistiche di riepilogo.

The find -exec Opzione

Il comando find ha un metodo integrato per chiamare programmi esterni per eseguire ulteriori elaborazioni sui nomi di file che restituisce. L'opzione -exec (execute) ha una sintassi simile ma diversa dal comando xargs.

find . -name “*.page” -type f -exec wc -c “{}” ;

Questo conterà le parole nei file corrispondenti. Il comando è composto da questi elementi.

  • trova .: avvia la ricerca nella directory corrente. Il comando trova è ricorsivo per impostazione predefinita, quindi verranno cercate anche le sottodirectory.
  • -name “*.page”: Stiamo cercando file con nomi che corrispondono a “*.page” stringa di ricerca.
  • -type f: Cerchiamo solo file, non directory.
  • -exec wc >: eseguiremo il comando wc sui nomi di file che corrispondono alla stringa di ricerca.
  • -w: Tutte le opzioni che vuoi passare al comando devono essere posizionate immediatamente dopo il comando.
  • “{}”: Il “{ }” segnaposto rappresenta ogni nome file e deve essere l'ultimo elemento nell'elenco dei parametri.
  • ;: Un punto e virgola “;” viene utilizzato per indicare la fine dell'elenco dei parametri. Deve essere evitato con una barra rovesciata “” in modo che la shell non lo interpreti.

Quando eseguiamo quel comando, vediamo l'output di wc. Il -c (conteggio byte) limita il suo output al numero di byte in ciascun file.

Pubblicità

Come puoi vedere non c'è un totale. Il comando wc viene eseguito una volta per nome file. Sostituendo un segno più “+” per il punto e virgola finale “;” possiamo modificare il comportamento di -exec per operare su tutti i file contemporaneamente.

find . -name “*.page” -type f -exec wc -c “{}” +

< /p>

Otteniamo il riepilogo totale e i risultati ordinatamente tabulati che ci dicono che tutti i file sono stati passati a wc come una lunga riga di comando.

exec Really Means exec

L'opzione -exec (esegui) non avvia il comando eseguendolo nella shell corrente. Utilizza l'exec integrato di Linux per eseguire il comando, sostituendo il processo corrente, la tua shell, con il comando. Quindi il comando che viene lanciato non è affatto in esecuzione in una shell. Senza una shell, non puoi ottenere l'espansione della shell dei caratteri jolly e non hai accesso agli alias e alle funzioni della shell.

Questo computer ha una funzione della shell definita chiamata solo parole. Questo conta solo le parole in un file.

funzione solo parole () {   wc -w $1 } RELATEDCome creare alias e funzioni della shell su Linux

Forse una strana funzione, “solo parole” è molto più lungo da digitare di “wc -w” ma almeno significa che non devi ricordare le opzioni della riga di comando per wc. Possiamo testare ciò che fa in questo modo:

solo parole user_commands.pages

Funziona bene con una normale chiamata da riga di comando. Se proviamo a invocare quella funzione usando l'opzione find‘s -exec, fallirà.

trovare . -name “*.page” -type f -exec solo parole “{}” ;

Pubblicità

Il comando find non riesce a trovare la shell funzione e l'azione -exec non riesce.

Per ovviare a questo, possiamo trovare lanciare una shell Bash e passare il resto della riga di comando ad essa come argomenti per la shell. Dobbiamo racchiudere la riga di comando tra virgolette doppie. Ciò significa che dobbiamo evitare le virgolette doppie che si trovano intorno a “{}” sostituisci stringa.

Prima di poter eseguire il comando find, dobbiamo esportare la nostra funzione shell con l'opzione -f (come funzione):

export -f words-only find . -name “*.page” -type f -exec bash -c “solo parole “{}”” ;

Funziona come previsto.

Utilizzare il nome del file più di una volta

Se vuoi concatenare più comandi insieme puoi farlo, e tu può utilizzare “{}” sostituisci stringa in ogni comando.

trova . -name “*.page” -type f -exec bash -c “basename “{}” && solo parole “{}”” ;

Se saliamo di un livello dalle “pagine” directory ed esegui quel comando, find scoprirà comunque i file PAGE perché cerca ricorsivamente. Il nome del file e il percorso vengono passati alla nostra funzione di sole parole proprio come prima. Solo per ragioni di dimostrazione dell'utilizzo di -exec con due comandi, chiamiamo anche il comando basename per vedere il nome del file senza il suo percorso.

Sia il comando basename che la shell di sole parole hanno i nomi dei file passati a loro utilizzando un “{}” sostituisci stringa.

Cavalli per Corsi

C'è un carico della CPU e una penalità di tempo per chiamare ripetutamente un comando quando potresti chiamarlo una volta e passargli tutti i nomi di file in una volta sola. E se invochi una nuova shell ogni volta per avviare il comando, il sovraccarico peggiora.

Pubblicità

Ma a volte, a seconda di cosa stai cercando di ottenere& #8212;potresti non avere un'altra opzione. Qualunque sia il metodo richiesto dalla tua situazione, nessuno dovrebbe essere sorpreso dal fatto che Linux fornisca opzioni sufficienti per trovare quella adatta alle tue esigenze particolari.

LEGGI SUCCESSIVO

  • › Vincitori del premio How-To Geek's Best of CES 2022: di cosa siamo entusiasti
  • › Quali contenuti 8K sono effettivamente disponibili?
  • › Nulla di utile deriva da uno scorrimento insensato
  • › Gli occhiali a luce blu funzionano? Tutto quello che devi sapere
  • › Che cosa significa “NBD” Significa, e come lo uso?
  • › Ricordando VRML: Il Metaverso del 1995