Rekisteröitymätön käyttäjä
Ero sivun ”Find” versioiden välillä
Siirry navigaatioon
Siirry hakuun
→Findin yhdistäminen muihin komentoihin: Paljon uutta asiaa
(Uusi osio; ajattelin että findin yhdistäminen muihin komentoihin on niin monipuolista ja rikasta, että se ansaitsee oman osionsa.) |
(→Findin yhdistäminen muihin komentoihin: Paljon uutta asiaa) |
||
Rivi 22: | Rivi 22: | ||
=== Findin yhdistäminen muihin komentoihin === | === Findin yhdistäminen muihin komentoihin === | ||
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. | 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 '{}' + | |||
==== 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. | Asettaa o+rwX-[[Tiedoston oikeudet|oikeudet]] <tt>file.txt</tt>-nimisille tiedostoille kaikissa alihakemistoissa. | ||
Rivi 28: | Rivi 70: | ||
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. | 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/ -- {} + | find ~jani-petteri -type l -iname '*å*' -exec mv --target-directory=~tobias/foo/stuff/ -- {} + | ||
==Katso myös== | ==Katso myös== |