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/ \; 
  1. Începe să caute fișiere în $HOME.
  2. Dacă găsește un fișier care se potrivește cu $HOME/$dir_name, nu va intra sub el („elimină” subdirectorul).
  3. Î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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *