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/ \;
- Aloittaa tiedostojen etsimisen hakemistosta
$HOME
. - Jos se löytää tiedoston, joka vastaa
$HOME/$dir_name
, se ei mene sen alle (”karkottaa” alihakemiston). - 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