Jeg har et enkelt skript som jeg forstår mest av, det er finn-kommandoen som er uklar. Jeg har mye dokumentasjon, men det tjener ikke til å gjøre det mye tydeligere. Min tanke er at den fungerer som en for-loop, den nåværende filen er byttet inn for {} og kopiert til $ HOME / $ dir_name, men hvordan gjør søket med -path og -beskjære -o arbeid? Det er irriterende å ha så spesifikk og relevant dokumentasjon og fremdeles ikke vite hva som skjer.

#!/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 

Dette er bare dokumentasjonen jeg vet jeg burde kunne finne ut av dette.

-sti mønster

Filnavnet samsvarer med mønsteret på skallmønsteret. Metategnene behandler ikke / eller . spesielt; så, for eksempel, finne. -sti «./sr*sc» vil skrive ut en oppføring for en katalog som heter ./src/misc (hvis en finnes). For å ignorere et helt katalogtre, bruk -prune i stedet for å sjekke alle filene i treet. For å hoppe over katalogen src / emacs og alle filer og kataloger under den, og skrive ut navnene på de andre filene som er funnet, gjør du noe som dette:

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

Fra Findutils manual

– Handling: -exec-kommando; Denne usikre varianten av handlingen -execdir er spesifisert av POSIX. Hovedforskjellen er at kommandoen kjøres i katalogen som find ble påkalt fra, noe som betyr at {} utvides til en relativ bane som begynner med navnet på en av starte kataloger, i stedet for bare grunnnavnet til den samsvarende filen.

Mens noen implementeringer av finn erstatter {} bare der den vises alene i et argument erstatter GNU finn {} uansett hvor det vises.

Og

For eksempel, for å sammenligne hver C-headerfil i eller under gjeldende katalog med filen / tmp / master:

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

Kommentarer

  • Mulig duplikat av finn: beskjære ignorerer ikke spesifisert bane
  • Jeg tror at hvis det er noe, ‘ er et duplikat av finn-sti forklart selv om svaret på find: beskjære ikke ignorerer angitt s ath har et svar som ser ut til å gjelde for dette spørsmålet. Kanskje svarene på find-path forklarte gir mening for noen mer erfarne med skripting, men de hjelper meg ikke ‘. Svarene som er tilstede her gir mer mening for meg så langt, selv om jeg ‘ begynner å se nærmere på dem.

Svar

-path fungerer akkurat som -name, men bruker mønsteret på hele banenavnet til filen som undersøkes, i stedet for til den siste komponenten.

-prune forbyr å synke under den funnet filen, i tilfelle det var en katalog.

Når du legger alt sammen, begynner kommandoen

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; 
  1. Ser etter filer i $HOME.
  2. Hvis den finner en fil som samsvarer med $HOME/$dir_name, vil den ikke gå under den («beskjærer» underkatalogen).
  3. Ellers (-o) hvis den finner en fil som samsvarer med *$file_suffix kopierer den til $HOME/$dir_name/.

Ideen ser ut til å være å ta sikkerhetskopi av noe av innholdet i $HOME i en underkatalog historien om $HOME. Delene med -prune er åpenbart nødvendige for å unngå å ta sikkerhetskopier av sikkerhetskopier …

Kommentarer

  • Hvis jeg forstår det: finn vil iterere gjennom hver katalog i $ HOME at den har tillatelser å gå inn i, bortsett fra $ HOME / $ dir_name, som den ikke vil falle ned i (fordi beskjæringshandlingen vil evalueres til sant og eller blir ikke tatt), søker etter filer som slutter med $ file_suffix. Så snart den finner en, vil den utføre cp » found_file.sh » til $ HOME / $ dir_name? Også, -path tillater en bane til en fil, og er nyttig når du vil finne å komme ned i kataloger og ikke bare jobbe i den nåværende katalogen?
  • Din forståelse er nesten riktig. -path fungerer akkurat som -name: den velger filer. Forskjellen er at -name samsvarer med et mønster med filnavnet, mens -path samsvarer med et mønster til hele stienavnet. find faller alltid ned i underkataloger, med mindre det er hindret av -maxdepth eller -prune osv.
  • Åh!-path blir brukt på $ HOME / $ dir_name -prune, så er det ‘ rekkefølgen på kommandoer som ødela meg, og -path er nødvendig for beskjæringskommandoen fordi den må samsvare med hele banen til den beskjærte katalogen.
  • @Darren I ‘ jeg er ikke sikker på om den ‘ s ganske nøyaktig. -path $HOME/$dir_name er en handling. Det er en test som sjekker om banen til den nåværende filen som undersøkes, samsvarer med hva $HOME/$dir_name er. -prune er en egen handling. Jeg tror at første setningen i din første kommentar gjenspeiler nøyaktig hvordan det fungerer.
  • Ville det mangle noe å se det som et rør? Jeg byttet -beskjær med -print og tror flyten er klar nå: finn $ HJEM | -sti $ HOME / $ dir_name | -print

Svar

Det er en del av find-kommandoen, -exec-setningen.

Den lar deg samhandle med filen / katalogen som er funnet av find -kommandoen.

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

find $HOME betyr å finne filer / kataloger i $ HOME

For å forstå -path <some_path>, se `finn-sti` forklart

For å forstå -prune, se https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh

-o betyr OR, så -path <some_path> ELLER -name *$file_suffix

-exec betyr å utføre kommandoen.

cp {} $HOME/$dir_name/ kopier filer som samsvarer med $HOME/$dir_name/

\; betyr avslutte -exec kommandoen

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *