Am un script simplu pe care îl înțeleg cel mai mult, este comanda find care este neclară. Am „o mulțime de documentație, dar nu servește pentru a o face mult mai clară. Gândul meu este că funcționează ca o buclă for, fișierul găsit în prezent este schimbat în {} și copiat în $ HOME / $ dir_name, dar cum se face căutarea cu -path și -prune -o funcționează? Este „enervant să ai o astfel de documentare specifică și relevantă și încă nu știi ce se întâmplă.
#!/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
Aceasta este doar documentația pe care știu că ar trebui fi capabil să descopere acest lucru din.
-path pattern
Numele fișierului se potrivește cu modelul shell pattern. Metacaracterele nu tratează / sau . în mod special; astfel, de exemplu, găsiți. -path „./sr*sc” va imprima o intrare pentru un director numit ./src/misc (dacă există unul). Pentru a ignora un întreg arbore de directoare, utilizați -prune mai degrabă decât să verificați fiecare fișier din arbore. De exemplu, pentru a omite directorul src / emacs și toate fișierele și directoarele de sub acesta și pentru a imprima numele celorlalte fișiere găsite, faceți așa ceva:
find . -path ./src/emacs -prune -o -print
Din manual Findutils
– Acțiune: -exec comandă; Această variantă nesigură a acțiunii -execdir este specificată de POSIX. Diferența principală este că comanda este executată în directorul din care a fost invocat găsi , ceea ce înseamnă că {} este extins la o cale relativă începând cu numele unuia dintre directoare de pornire, mai degrabă decât doar numele de bază al fișierului potrivit.
În timp ce unele implementări ale găsi înlocuiesc {} numai acolo unde apare singur într-un argument, GNU găsi înlocuiește {} oriunde apare.
Și
De exemplu, pentru a compara fiecare fișier de antet C din sau sub directorul curent cu fișierul / tmp / master:
find . -name "*.h" -execdir diff -u "{}" /tmp/master ";"
Comentarii
- Posibil duplicat al găsiți: prune nu ignoră calea specificată
- Cred că, dacă este ceva, ‘ este un duplicat al căii de căutare explicat chiar dacă răspunsul la găsi: prune nu ignoră p specificat ath are un răspuns care pare să se aplice acestei întrebări. Poate că răspunsurile găsi-cale explicate au sens pentru cineva mai experimentat cu scripturi, dar nu mă ajută ‘. Răspunsurile prezente aici au mai mult sens pentru mine până acum, chiar dacă ‘ abia încep să mă uit în ele.
Răspuns
-path
funcționează exact ca -name
, dar aplică modelul întreaga cale de acces a fișierului examinat, în loc de ultima componentă.
-prune
interzice coborârea sub fișierul găsit, în cazul în care a fost un director.
Punând totul împreună, comanda
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
- Începe să caute fișiere în
$HOME
. - Dacă găsește un fișier care se potrivește cu
$HOME/$dir_name
, nu va intra sub el („elimină” subdirectorul). - În caz contrar (
-o
) dacă găsește un fișier care se potrivește cu*$file_suffix
îl copiază în$HOME/$dir_name/
.
Ideea pare să facă o copie de rezervă a unora dintre conținutul $HOME
într-un subdirec conservator al $HOME
. Părțile cu -prune
este evident necesară pentru a evita realizarea copiilor de rezervă ale copiilor de rezervă …
Comentarii
- Dacă înțeleg atunci: find va itera prin fiecare director din $ HOME în care are permisiuni pentru a intra, cu excepția $ HOME / $ dir_name, în care nu va coborî (deoarece acțiunea de prune va fi evaluată la true și sau nu vor fi luate), căutând fișiere care se termină cu $ file_suffix. Apoi, de îndată ce va găsi unul, va executa cp ” found_file.sh ” în $ HOME / $ dir_name? De asemenea, -path permite o cale către un fișier și este util atunci când doriți să găsiți să coborâți în directoare și să nu lucrați doar în directorul curent?
- Înțelegerea dvs. este aproape corect.
-path
funcționează la fel ca-name
: selectează fișiere. Diferența este că-name
se potrivește cu un model cu numele fișierului, în timp ce-path
se potrivește cu un model cu calea completă.find
coboară întotdeauna în subdirectoare, cu excepția cazului în care este împiedicat de-maxdepth
sau-prune
etc. - Oh!-path este aplicat la $ HOME / $ dir_name -prune apoi, ‘ este ordinea comenzilor care mă încurcau, iar -path este necesar pentru comanda de prune deoarece trebuie să se potrivească cu calea completă a directorului tăiat.
- @Darren Nu ‘ nu sunt sigur dacă ‘ Este destul de precis.
-path $HOME/$dir_name
este o acțiune. Este un test care verifică dacă calea fișierului curent examinat se potrivește cu orice$HOME/$dir_name
este.-prune
este o acțiune separată. Cred că prima propoziție a primului comentariu reflectă cu exactitate modul în care funcționează. - Ar lipsi ceva pentru a o vedea ca pe o țeavă? Am schimbat -prune cu -print și cred că fluxul este clar acum: găsiți $ HOME | -path $ HOME / $ dir_name | -print
Răspuns
Face parte din comanda find, declarația -exec.
Vă permite să interacționați cu fișierul / directorul găsit de comanda find
.
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
înseamnă căutați fișiere / directoare în $ HOME
Pentru a înțelege -path <some_path>
, consultați `find -path` explicat
Pentru a înțelege -prune
, consultați https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh
-o
înseamnă SAU, deci -path <some_path>
SAU -name *$file_suffix
-exec
înseamnă executarea comenzii.
cp {} $HOME/$dir_name/
copiați toate fișierele care se potrivesc în $HOME/$dir_name/
\;
înseamnă terminați comanda -exec