Ero sivun ”Find” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
(Luokka:Ohjelmat + exec-esimerkki)
Ei muokkausyhteenvetoa
 
(14 välissä olevaa versiota 6 käyttäjän tekeminä ei näytetä)
Rivi 1: Rivi 1:
'''find'''-komennolla voi etsiä asioita koneelta ja tiedostoista.
{{DISPLAYTITLE:{{lcfirst:{{PAGENAME}}}}}}
'''find'''-[[komentorivi]]komennolla voi etsiä tiedostoja tiettyihin ehtoihin, kuten tiedostonnimeen tai omistajaan perustuen. Find mahdollistaa myös erilaisten toimintojen suorittamisen hakutulokseen pohjautuen. Valmiiseen tietokantaan pohjautuvia hakuja voi tehdä [[locate]]-ohjelmalla ja tiedostojen sisältöä koskevia hakuja [[grep]]illä.


== Esimerkkejä miten findia käytetään ==
== Käyttö ==


Etsi *.log täältä ja alahakemistoista:
Etsii .log-päätteiset (*.log) tiedostot nykyisestä hakemistosta (.) ja alihakemistoista.
  find . -name *.log
  find -name '*.log'


Etsi isoimmat filet:
Listaa [[linuxin hakemistorakenne|/var-hakemistosta]] ja sen alihakemistoista kaikki tavalliset tiedostot (ei siis hakemistoja, laitetiedostoja, [[symbolinen linkki|symbolisia linkkejä]], [[nimetty putki|nimettyjä putkia]] ym.) joita on muutettu viimeisen 30 minuutin aikana.
  find /var -type f -printf "%s\t%p\n"|sort +0n
  find /var -type f -mmin -30 -print


Listaa kaikki tiedostot joita on muutettu viimeisen 30min aikana, myös alihakemistoista:
Laskee montako .jpg-tiedostoa nykyisestä hakemistosta ja sen alihakemistoista löytyy huomioiden myös isolla kirjoitetut merkit.
  find . -type f -mmin -30 -print
  find -iname '*.jpg' | [[wc]] -l


Laskee montako jpg fileä hakemiston alta löytyy:
Etsii nykyisestä hakemistosta ja sen alihakemistoista kaikki tavalliset tiedostot ja hakemistot jotka ovat tyhjiä ja joiden omistajaksi määriteltyä [[GID|ryhmänumeroa]] ei vastaa mikään järjestelmän olemassaoleva ryhmä.
  find -name '*.jpg' | wc -l
  find -empty -nogroup


Laittaa o+rwX oikeuden file.txt:lle kaikissa alihakemistoissa:
Etsii ja poistaa kaikki käyttäjän greta omistamat noin 699 megatavun kokoiset tiedostot.
  find . -name file.txt -print0 | xargs -0 chmod o+rwX
  find -size 699M -user greta -delete


Siirtää kaikki käyttäjän jani-petteri kotihakemistossa olevat [[symbolinen linkki|symlinkit]] joiden nimi sisältää  å:n käyttäjän tobias kotihakemiston alla sijaitsevaan foo/stuff-hakemistoon.
Lisää find-komennon käyttötapoja löytyy [[komentorivivinkkejä]]-sivulta.
find ~jani-petteri -type l -name *å*  -exec mv '{}' ~tobias/foo/stuff/ ';'


Lisää find komennon käyttötapoja löytyy [[Komentorivivinkkejä]]-sivulta.
=== Findin yhdistäminen muihin komentoihin ===


[[Luokka:Komentorivi]]
Findin hyödyt tulevat parhaiten ilmi, kun ei vain tyydytä tiedostojen etsimiseen - työpöytäympäristöissä on yleensä oma helppokäyttöisempi ja esteettisempi työkalu tätä varten - vaan kun löydetyille tiedostoille pitää suorittaa mahdollisesti monimutkaisiakin operaatioita automaattisesti. Tämä on etenkin skripteissä käytännöllistä.
[[Luokka:Ohjelmat]]
 
Jos tiedostopolkujen prosessointi riittää, voi findin tulostetta putkittaa ja uudelleen ohjata aivan tavalliseen tapaan. Jos tämä ei kuitenkaan riitä, voi käyttää [[xargs]]-komentoa tai lipukkeita '''-exec''' ja '''-execdir'''.
 
Otetaan ensimmäiseksi esimerkiksi tiedostojen listaaminen '''[[ls]]'''-komennon tapaisesti. Tähän löytyy findista oma lipukkeensa '''-ls''', joka tuottaa suunnilleen komentoa '''ls -dils''' vastaavan tulosteen. Tällä on kuitenkin puutteensa: jotkin kentät voivat olla ylimääräisiä, ääkköset tiedostonimissä voivat tulostua omituisesti eikä tiedostojen järjestys ole välttämättä mieluinen. Nämä ongelmat voidaan sivuuttaa findin '-exec'-lipukkeella, jolla voimme käytttää hakutuloksena saatuja tiedostoja 'ls'-komennon argumentteina; näin siis saamme lisää joustavuutta, sillä nyt voimme käyttää '''ls'''-komennon valitsimia. '-exec'-lipukkeen syntaksi on suurinpiirtein seuraava:
 
find ./ -exec komento valinnat '{}' \;
 
Nyt voimme esimerkiksi listata kaikki tiedostot väritettyinä ja tyypeittäin luokiteltuina, ilman ryhmä- ja omistajakenttiä ja näyttää tiedoston viimeisimmän muokkaamisen ajankohdan ja lukea tämän kaiken miellyttävästi [[less]]-komennolla:
find -exec ls -dGghl --file-type --color \
--time-style=long-iso --time=ctime -- {} \; | less -RM
 
Komento siis etsii rekursiivisesti kaikki tiedostot ja alikansioiden tiedostot ja suorittaa jokaiselle löydetylle tiedostolle erikseen komennon ''komento valinnat tiedosto''. Find sijoittaa tiedoston hakemistopolun kaarisulkujen paikalle.
 
Edellä kuvattiin '''-delete'''-lipukkeen käyttö tiedostojen poistamisessa. Jälleen voimme kuitenkin saavuttaa joustavuutta '-exec'-lipukkeen käytöllä: ehkä tahdommekin nähdä, mitkä tiedostot tulimmekaan poistaneeksi. Jos suoritamme seuraavan komennon
find ./kuvia/ -iname '*.jpg' -exec rm --verbose -- '{}' \;
 
alla luetellussa hakemistorakenteessa
 
└── kuvia
    ├── d13jlk.gif
    ├── häät.jpg
    ├── KUKKA.JPG
    └── omena.jpg
 
vastaa tämä olennaisesti seuraavan kolmen komennon peräkkäistä suorittamista
rm --verbose -- ./kuvia/häät.jpg
rm --verbose -- ./kuvia/KUKKA.JPG
rm --verbose -- ./kuvia/omena.jpg
 
Kuten näkyy, on tiedosto sijoitettu kaarisulkujen paikalle. Tämä ratkaisu ei kuitenkaan ole tehokkain mahdollinen, sillä nyt '''rm'''-komentoa kutsutaan kolme kertaa peräkkäin, mikä tuhlaa sekä aikaa, että muistia. Miten voisimme suorittaa tehokkaampaa komentoa
rm --verbose -- ./kuvia/häät.jpg ./kuvia/KUKKA.JPG ./kuvia/omena.jpg
vastaavan operaation findia käyttäen? Tämä hoituu melkein samoin kuin yllä
find ./kuvia/ -iname '*.jpg' -exec rm --verbose -- '{}' +
 
Kaikki löydetyt tiedostot siis lisätään peräkkäin argumenteiksi kaarisulkeiden osoittamalle paikalle. Jos argumentteja on hyvin paljon, joudutaan ne ehkä jakamaan muutamiin osiin. Olennaisesti kuitenkin komentoa kutsutaan huomattavasti harvemmin.
Yleinen syntaksi siis on nyt
find ./ -exec komento valinnat '{}' +
 
Vaihtoehto '-exec'-lipukkeelle on '''-execdir'''. Se suorittaa komennon käyttäen työhakemistona hakutuloksen kansiota, mikä tuo turvallisuushyötyjä.
 
'''-ok'''-lipuke on kuin '-exec', mutta ennen komennon suorittamista käyttäjältä kysytään varmistus. '''-okdir''' on '-execdir'-lipukkeen vastine.
 
==== Esimerkkejä ====
Seuraava laskee työhakemiston ja sen kaikkien alihakemistojen avi-tiedostojen koot kilotavuissa ja tulostaa niiden summan.
find ./ -type f -iname '*.avi' -exec du {} + | awk '{s+=$1} END {print s}'
 
Asettaa o+rwX-[[Tiedoston oikeudet|oikeudet]] <tt>file.txt</tt>-nimisille tiedostoille kaikissa alihakemistoissa.
find . -name file.txt -execdir [[chmod]] 'o+rwX' {} +
 
Siirtää kaikki käyttäjän jani-petteri kotihakemistossa olevat [[symbolinen linkki|symboliset linkit]], joiden nimi sisältää ison tai pienen å:n, käyttäjän tobias kotihakemiston alla sijaitsevaan foo/stuff-hakemistoon.
find ~jani-petteri -type l -iname '*å*'  -exec mv --target-directory=~tobias/foo/stuff/ -- {} +
 
==Katso myös==
*[[locate]]
*[[grep]]
*[[xargs]]
 
[[Luokka:Komentorivin perustyökalut]]
[[Luokka:Tiedostonhallinta]]

Nykyinen versio 22. joulukuuta 2015 kello 17.07

find-komentorivikomennolla voi etsiä tiedostoja tiettyihin ehtoihin, kuten tiedostonnimeen tai omistajaan perustuen. Find mahdollistaa myös erilaisten toimintojen suorittamisen hakutulokseen pohjautuen. Valmiiseen tietokantaan pohjautuvia hakuja voi tehdä locate-ohjelmalla ja tiedostojen sisältöä koskevia hakuja grepillä.

Käyttö[muokkaa]

Etsii .log-päätteiset (*.log) tiedostot nykyisestä hakemistosta (.) ja alihakemistoista.

find -name '*.log'

Listaa /var-hakemistosta ja sen alihakemistoista kaikki tavalliset tiedostot (ei siis hakemistoja, laitetiedostoja, symbolisia linkkejä, nimettyjä putkia ym.) joita on muutettu viimeisen 30 minuutin aikana.

find /var -type f -mmin -30 -print

Laskee montako .jpg-tiedostoa nykyisestä hakemistosta ja sen alihakemistoista löytyy huomioiden myös isolla kirjoitetut merkit.

find -iname '*.jpg' | wc -l

Etsii nykyisestä hakemistosta ja sen alihakemistoista kaikki tavalliset tiedostot ja hakemistot jotka ovat tyhjiä ja joiden omistajaksi määriteltyä ryhmänumeroa ei vastaa mikään järjestelmän olemassaoleva ryhmä.

find -empty -nogroup

Etsii ja poistaa kaikki käyttäjän greta omistamat noin 699 megatavun kokoiset tiedostot.

find -size 699M -user greta -delete

Lisää find-komennon käyttötapoja löytyy komentorivivinkkejä-sivulta.

Findin yhdistäminen muihin komentoihin[muokkaa]

Findin hyödyt tulevat parhaiten ilmi, kun ei vain tyydytä tiedostojen etsimiseen - työpöytäympäristöissä on yleensä oma helppokäyttöisempi ja esteettisempi työkalu tätä varten - vaan kun löydetyille tiedostoille pitää suorittaa mahdollisesti monimutkaisiakin operaatioita automaattisesti. Tämä on etenkin skripteissä käytännöllistä.

Jos tiedostopolkujen prosessointi riittää, voi findin tulostetta putkittaa ja uudelleen ohjata aivan tavalliseen tapaan. Jos tämä ei kuitenkaan riitä, voi käyttää xargs-komentoa tai lipukkeita -exec ja -execdir.

Otetaan ensimmäiseksi esimerkiksi tiedostojen listaaminen ls-komennon tapaisesti. Tähän löytyy findista oma lipukkeensa -ls, joka tuottaa suunnilleen komentoa ls -dils vastaavan tulosteen. Tällä on kuitenkin puutteensa: jotkin kentät voivat olla ylimääräisiä, ääkköset tiedostonimissä voivat tulostua omituisesti eikä tiedostojen järjestys ole välttämättä mieluinen. Nämä ongelmat voidaan sivuuttaa findin '-exec'-lipukkeella, jolla voimme käytttää hakutuloksena saatuja tiedostoja 'ls'-komennon argumentteina; näin siis saamme lisää joustavuutta, sillä nyt voimme käyttää ls-komennon valitsimia. '-exec'-lipukkeen syntaksi on suurinpiirtein seuraava:

find ./ -exec komento valinnat '{}' \;

Nyt voimme esimerkiksi listata kaikki tiedostot väritettyinä ja tyypeittäin luokiteltuina, ilman ryhmä- ja omistajakenttiä ja näyttää tiedoston viimeisimmän muokkaamisen ajankohdan ja lukea tämän kaiken miellyttävästi less-komennolla:

find -exec ls -dGghl --file-type --color \
--time-style=long-iso --time=ctime -- {} \; | less -RM

Komento siis etsii rekursiivisesti kaikki tiedostot ja alikansioiden tiedostot ja suorittaa jokaiselle löydetylle tiedostolle erikseen komennon komento valinnat tiedosto. Find sijoittaa tiedoston hakemistopolun kaarisulkujen paikalle.

Edellä kuvattiin -delete-lipukkeen käyttö tiedostojen poistamisessa. Jälleen voimme kuitenkin saavuttaa joustavuutta '-exec'-lipukkeen käytöllä: ehkä tahdommekin nähdä, mitkä tiedostot tulimmekaan poistaneeksi. Jos suoritamme seuraavan komennon

find ./kuvia/ -iname '*.jpg' -exec rm --verbose -- '{}' \;

alla luetellussa hakemistorakenteessa

└── kuvia
    ├── d13jlk.gif
    ├── häät.jpg
    ├── KUKKA.JPG
    └── omena.jpg

vastaa tämä olennaisesti seuraavan kolmen komennon peräkkäistä suorittamista

rm --verbose -- ./kuvia/häät.jpg
rm --verbose -- ./kuvia/KUKKA.JPG
rm --verbose -- ./kuvia/omena.jpg

Kuten näkyy, on tiedosto sijoitettu kaarisulkujen paikalle. Tämä ratkaisu ei kuitenkaan ole tehokkain mahdollinen, sillä nyt rm-komentoa kutsutaan kolme kertaa peräkkäin, mikä tuhlaa sekä aikaa, että muistia. Miten voisimme suorittaa tehokkaampaa komentoa

rm --verbose -- ./kuvia/häät.jpg ./kuvia/KUKKA.JPG ./kuvia/omena.jpg 

vastaavan operaation findia käyttäen? Tämä hoituu melkein samoin kuin yllä

find ./kuvia/ -iname '*.jpg' -exec rm --verbose -- '{}' +

Kaikki löydetyt tiedostot siis lisätään peräkkäin argumenteiksi kaarisulkeiden osoittamalle paikalle. Jos argumentteja on hyvin paljon, joudutaan ne ehkä jakamaan muutamiin osiin. Olennaisesti kuitenkin komentoa kutsutaan huomattavasti harvemmin.

Yleinen syntaksi siis on nyt

find ./ -exec komento valinnat '{}' +

Vaihtoehto '-exec'-lipukkeelle on -execdir. Se suorittaa komennon käyttäen työhakemistona hakutuloksen kansiota, mikä tuo turvallisuushyötyjä.

-ok-lipuke on kuin '-exec', mutta ennen komennon suorittamista käyttäjältä kysytään varmistus. -okdir on '-execdir'-lipukkeen vastine.

Esimerkkejä[muokkaa]

Seuraava laskee työhakemiston ja sen kaikkien alihakemistojen avi-tiedostojen koot kilotavuissa ja tulostaa niiden summan.

find ./ -type f -iname '*.avi' -exec du {} + | awk '{s+=$1} END {print s}'

Asettaa o+rwX-oikeudet file.txt-nimisille tiedostoille kaikissa alihakemistoissa.

find . -name file.txt -execdir chmod 'o+rwX' {} +

Siirtää kaikki käyttäjän jani-petteri kotihakemistossa olevat symboliset linkit, joiden nimi sisältää ison tai pienen å:n, käyttäjän tobias kotihakemiston alla sijaitsevaan foo/stuff-hakemistoon.

find ~jani-petteri -type l -iname '*å*'  -exec mv --target-directory=~tobias/foo/stuff/ -- {} +

Katso myös[muokkaa]