Ho uno script semplice di cui capisco la maggior parte, è il comando find che non è chiaro. Ho molta documentazione ma non serve a renderla molto più chiara. Il mio pensiero è che funzioni come un ciclo for, il file attualmente trovato viene scambiato per {} e copiato in $ HOME / $ nome_dir, ma come funziona la ricerca con -path e -prune -o funziona? È fastidioso avere una documentazione così specifica e pertinente e ancora non sapere cosa sta succedendo.

#!/bin/bash # The files will be search on from the user"s home # directory and can only be backed up to a directory # within $HOME read -p "Which file types do you want to backup " file_suffix read -p "Which directory do you want to backup to " dir_name # The next lines creates the directory if it does not exist test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name # The find command will copy files that match the # search criteria ie .sh . The -path, -prune and -o # options are to exclude the backdirectory from the # backup. find $HOME -path $HOME/$dir_name -prune -o \ -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; exit 0 

Questa è solo la documentazione che so che dovrei essere in grado di capirlo da.

-path pattern

Il nome del file corrisponde al pattern della shell. I metacaratteri non trattano / o . in modo speciale; quindi, ad esempio, trova. -path “./sr*sc” stamperà una voce per una directory chiamata ./src/misc (se esiste). Per ignorare un intero albero di directory, usa -prune invece di controllare ogni file nellalbero. Ad esempio, per saltare la directory src / emacs e tutti i file e le directory sotto di essa e stampare i nomi degli altri file trovati, fai qualcosa del genere:

find . -path ./src/emacs -prune -o -print

Dal manuale di Findutils

– Azione: -exec comando; Questa variante non sicura dellazione -execdir è specificata da POSIX. La differenza principale è che il comando viene eseguito nella directory da cui è stato richiamato find , il che significa che {} viene espanso in un percorso relativo che inizia con il nome di uno dei directory di partenza, piuttosto che solo il nome di base del file corrispondente.

Mentre alcune implementazioni di find sostituiscono {} solo dove appare da solo in un argomento, GNU find sostituisce {} ovunque appaia.

E

Ad esempio, per confrontare ogni file di intestazione C nella o sotto la directory corrente con il file / tmp / master:

 find . -name "*.h" -execdir diff -u "{}" /tmp/master ";" 

Commenti

  • Possibile duplicato di find: prune non ignora il percorso specificato
  • Penso che semmai ‘ sia un duplicato di find-path spiegato anche se la risposta in find: prune non ignora il p specificato ath ha una risposta che sembra applicarsi a questa domanda. Forse le risposte trova-percorso spiegato hanno senso per qualcuno più esperto di scripting, ma non ‘ mi aiutano. Le risposte qui presenti hanno più senso per me finora, anche se ‘ sto appena iniziando a esaminarle.

La risposta

-path funziona esattamente come -name, ma applica il modello al lintero percorso del file in esame, invece dellultimo componente.

-prune vieta di scendere sotto il file trovato, nel caso fosse una directory.

Mettendo tutto insieme, il comando

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; 
  1. Inizia a cercare file in $HOME.
  2. Se trova un file che corrisponde a $HOME/$dir_name non passa sotto di esso (“elimina” la sottodirectory).
  3. Altrimenti (-o) se trova un file corrispondente a *$file_suffix lo copia in $HOME/$dir_name/.

Lidea sembra essere quella di fare un backup di alcuni dei contenuti di $HOME in una sottodirec storia di $HOME. Le parti con -prune sono ovviamente necessarie per evitare di fare backup di backup …

Commenti

  • Se capisco allora: find itererà attraverso ogni directory in $ HOME in cui ha i permessi per entrare, eccetto $ HOME / $ dir_name, in cui non discenderà (perché lazione prune valuterà come true e il o non verrà preso), cercando i file che terminano con $ file_suffix. Quindi, non appena ne trova uno, eseguirà cp ” found_file.sh ” in $ HOME / $ dir_name? Inoltre, -path consente un percorso a un file ed è utile quando vuoi che find scenda nelle directory e non solo lavori nella directory corrente?
  • La tua comprensione è quasi corretta. -path funziona esattamente come -name: seleziona i file. La differenza è che -name abbina un pattern al nome del file, mentre -path abbina un pattern al percorso completo. find discende sempre in sottodirectory, a meno che non sia impedito da -maxdepth o -prune ecc.
  • Oh!-path viene applicato a $ HOME / $ dir_name -prune quindi, ‘ è lordine dei comandi che mi ha incasinato, e -path è necessario per il comando prune perché è deve corrispondere al percorso completo della directory eliminata.
  • @Darren I ‘ non sono sicuro che ‘ è abbastanza preciso. -path $HOME/$dir_name è unazione. Si tratta di un test che controlla se il percorso del file corrente in esame corrisponde a qualunque sia $HOME/$dir_name. -prune è unazione separata. Penso che la prima frase del tuo primo commento rifletta accuratamente come funziona.
  • Mancherebbe qualcosa per vederlo come una pipa? Ho scambiato -prune con -print e penso che il flusso sia chiaro ora: trova $ HOME | -path $ HOME / $ nome_dir | -print

Answer

Fa parte del comando find, listruzione -exec.

Ti permette di interagire con il file / directory trovato dal comando find.

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;

find $HOME significa trovare file / directory in $ HOME

Per capire -path <some_path>, vedere `find -path` spiegato

Per capire -prune, vedere https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh

-o significa OR, quindi -path <some_path> OPPURE -name *$file_suffix

-exec significa eseguire il comando.

cp {} $HOME/$dir_name/ copia qualsiasi file corrispondente a $HOME/$dir_name/

\; significa terminare il comando -exec

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *