Minulla on yksinkertainen komentosarja, josta ymmärrän suurimman osan, se on etsintäkomento, joka on epäselvä. Minulla on paljon dokumentaatiota, mutta se ei tee siitä paljon selkeämpää. Ajattelen, että se toimii kuin for-loop, tällä hetkellä löydetty tiedosto vaihdetaan hakemistoon {} ja kopioidaan tiedostoon $ HOME / $ dir_name, mutta miten haku -path ja -prune -o työ? On ärsyttävää, että meillä on niin tarkkoja ja asiaankuuluvia asiakirjoja, etkä edelleenkään tiedä mitä tapahtuu.

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

Nämä ovat vain ne asiakirjat, jotka minun pitäisi tietää osaa selvittää tämän.

-path pattern

Tiedostonimi vastaa kuorikuviota. Metahahmot eivät käsittele / tai . erityisesti; niin esimerkiksi löytää. -path ”./sr*sc” tulostaa merkinnän hakemistolle ./src/misc (jos sellainen on). Jos haluat ohittaa koko hakemistopuun, käytä -prune -ohjelmaa sen sijaan, että tarkistat jokaisen puun tiedoston. Esimerkiksi, jos haluat ohittaa hakemiston src / emacs ja kaikki sen alla olevat tiedostot ja hakemistot ja tulostaa muiden löydettyjen tiedostojen nimet, tee jotain tällaista:

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

Lähde: Findutils-käsikirja

– Toiminto: -exec-komento; Tämän -execdir -toiminnon epävarman muunnelman määrittää POSIX. Tärkein ero on, että komento suoritetaan hakemistossa, josta etsi on kutsuttu, mikä tarkoittaa, että {} laajennetaan suhteelliseen polkuun, joka alkaa jonkin aloitushakemistot, eikä vain vastaavan tiedoston basename.

Vaikka jotkut find -toteutukset korvaavat {} vain siellä, missä se esiintyy itsenäisesti argumentissa GNU find korvaa {} missä tahansa.

Ja

Esimerkiksi, jos haluat verrata kutakin nykyisessä hakemistossa olevaa tai sen alapuolella olevaa C-otsikkotiedostoa tiedostoon / tmp / master:

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

Kommentit

  • Mahdollinen kopio sivusta etsi: luumu ei ohita määritettyä polkua
  • Luulen, että jos se jotain ’ on kopio löytöpolusta selitetty vaikka vastaus kohdassa find: prune ei sivuuttaisi määritettyä sivua ath lla on vastaus, joka näyttää soveltuvan tähän kysymykseen. Ehkä selitetyn polun vastaukset ovat järkeviä jollekin, joka on kokenut komentosarjoja, mutta ne eivät ’ auta minua. Tässä esitetyt vastaukset ovat mielestäni järkevämpiä toistaiseksi, vaikka ’ aloin vasta tutkia niitä.

Vastaus

-path toimii täsmälleen kuten -name, mutta soveltaa mallia koko tutkittavan tiedoston polku viimeisen komponentin sijaan.

-prune kieltää laskeutumisen löydetyn tiedoston alapuolelle, mikäli se oli hakemisto.

Kokonaisuutena komento

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; 
  1. Aloittaa tiedostojen etsimisen hakemistosta $HOME.
  2. Jos se löytää tiedoston, joka vastaa $HOME/$dir_name, se ei mene sen alle (”karkottaa” alihakemiston).
  3. Muuten (-o) jos se löytää tiedoston, joka vastaa *$file_suffix, kopioi sen tiedostoon $HOME/$dir_name/.

Ajatus näyttää olevan varmuuskopioida osa alihakemiston $HOME -sisällöstä $HOME. Osat, joissa on -prune, ovat tietysti välttämättömiä varmuuskopioiden tekemisen välttämiseksi …

Kommentit

  • Jos ymmärrän sitten: etsi iteroi jokaisen hakemiston kautta $ HOME, johon sillä on lupa mennä, paitsi $ HOME / $ dir_name, johon se ei laskeudu (koska karsintatoiminto arvioi arvon tosi ja tai ei oteta), etsimällä tiedostoja, jotka päättyvät tunnukseen $ file_suffix. Heti kun se löytää yhden, se suorittaa cp ” found_file.sh ” osioon $ HOME / $ dir_name? Lisäksi -path sallii polun tiedostoon ja on hyödyllinen, kun haluat löytää laskeutumisen hakemistoihin eikä vain työskennellä nykyisessä hakemistossa? oikea. -path toimii samalla tavalla kuin -name: se valitsee tiedostot. Erona on se, että -name vastaa mallia tiedostonimeen, kun taas -path vastaa mallia koko polkunimeen. find laskeutuu aina alihakemistoihin, ellei estä -maxdepth tai -prune jne.
  • Voi!-pathia käytetään silloin kansioon $ HOME / $ dir_name -prune, se ’ s minua sekoittaneiden komentojen järjestys, ja -path on välttämätön karsimiskomennolle, koska se täytyy täyttää karsitun hakemiston koko polku.
  • @Darren I ’ en ole varma, onko ’ s melko tarkka. -path $HOME/$dir_name on yksi toiminto. Se on testi, joka tarkistaa, vastaako nykyisen tutkittavan tiedoston polku mitä tahansa $HOME/$dir_name. -prune on erillinen toiminto. Mielestäni ensimmäisen kommenttisi ensimmäinen lause heijastaa tarkasti, miten se toimii.
  • Puuttuisiko jotain nähdäksesi sen putkena? Vaihdoin -prune -printillä ja ajattelin, että virtaus on selvä: etsi $ HOME | -path $ HOME / $ dir_name | -print

vastaus

Se on osa find-komentoa, -exec-käskyä.

Sen avulla voit olla vuorovaikutuksessa find -komennon löytämän tiedoston / hakemiston kanssa.

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

find $HOME tarkoittaa tiedostojen / hakemistojen löytämistä $ HOME -palvelusta

Jos haluat ymmärtää -path <some_path>, katso `etsi polku` selitetty

Ymmärtääksesi -prune, katso https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh

-o tarkoittaa TAI, joten -path <some_path> TAI -name *$file_suffix

-exec tarkoittaa komennon suorittamista.

cp {} $HOME/$dir_name/ kopioi kaikki tiedostot, jotka vastaavat $HOME/$dir_name/

\; tarkoittaa lopeta komento -exec

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *