Find on niin monipuolinen ettei sitä kannata selittää tavallisin keinoin, vaan aloittaa esimerkein:

find ~  # listaa kotikansion rekursiivisesti. Listauksessa on niin kansiot kuin tiedostotkin ja kaikki esitetään täydellisine polkuineen. 

find ~ -type f      # listaa ainoastaan tiedostot  
find ~ -type d      # listaa ainoastaan kansiot 
find ~ -type s      # listaa socket-tyypin tiedostot
 

find ~ -maxdepth 1 -type f      # maxdepth määrää listaamaan tiedostot vain niin monelta tasolta kuin sen numero osoittaa. 
find ~ -maxdepth 1 -not -type f # listaa kaiken muun kansiosta paitsi tiedostot. 
find ~ -size 0                  # listaa nollakokoiset tiedostot. Yhtäkuin-merkkiä ei kirjoiteta.
                                # Linuxissa on muuten paljon nollakokoisia tiedostoja jotka ovat Linuxin toiminnalle välttämättömiä. 
find ~ -size +100M              # listaa yli satamegaiset tiedostot 
find ~ -name *.txt              # listaa vain *.txt nimiset tiedostot. Listaa muuten kansiotkin, mutta harvemmin kansion nimessä on peräliite .txt.
find ~ -name *~ -delete         # poistaa backup-tiedostot kaikkialta kotikansiosta. Mietipä kannattaako käskyä kokeilla.
find /etc/rc3.d | sort -g       # lista käyttöjärjestelmän palveluista; luepa README

find ~ -maxdepth 1 -type f -print0               # tulostaa kaikki yhteen jonoon; tulostettuja erottaa vain näkymätön nolla-merkki 
find ~ -type f -print0 | xargs -0 komento        # jota hyödynnetään näin - tiedostojen nimissä voi silloin olla välilyöntejä ym. kummallista 
 
find ~ -maxdepth 1 -type f -exec echo '{}' \;    # Tarkoitus on esitellä käsky -exec. Echo:n paikalle voi laittaa minkä käskyn tahansa
                                                 # tuo '{}' kuvaa find:in löytämää tiedostonimien-joukkoa; siitä poimitaan käsiteltävät 
                                                 # järjestyksessä yksikerrallaan. Muuten kaikki käskyt laittavat tulosteensa tuonne {} 
                                                 # "paikanpitäjään". Esimerkiksi: ls . | xargs -i echo {} 
find ~ -maxdepth 1 -type f -exec echo '{}' +     # tehokkaampi muoto, mutta monet koneet eivät hyväksy sitä 

find ~ -mtime 0                                  # etsii tiedostot joita on muutettu 0-24 tuntia sitten - muuten time viittaa tunteihin~
find ~ -mtime -1                                 # etsii tiedostot joita on muutettu 0-24 tuntia sitten
find ~ -mtime 1                                  # etsii tiedostot joita on muutettu 24-48 tuntia sitten
find ~ -mtime +1                                 # etsii tiedostot joita on muutettu yli 48 tuntia sitten
find ~ -mmin +5 -mmin -10                        # etsii tiedostot joita on muutettu välillä 6-9 minuuttia sitten
find ~ -mmin -15 \( ! -regex ".*/\..*" \)        # listaa alle 15 minuuttia sitten muutetut jättäen piilotiedostot listaamatta.
find ~ -newer tiedosto_polkuineen                # listaa tiedostot joita on muutettu tiedosto_polkuineen jälkeen 

find ~ -perm 777                                 # etsi tiedostot joille on annettu 777 käyttöoikeudet
find ~ -perm -u=x -type f                        # etsi tiedostot joiden käyttäjällä on suoritusoikeus
find ~ -type f -exec grep -Flm 1 'hurjaa' {} +   # etsii tiedostot joista löytyy sana: hurjaa 
find ~ -type f -exec chmod -x {} \;              # poista suoritusoikeus kaikilta tiedostoilta
find ~  -not -path '*/\.*' 2>&1 | grep -v 'Lupa evätty' # listaa kansion tiedostot jättän pois piilotiedostot ja pääkäyttäjän oikeuksia vaativat
find ~ -uid 1000                                 # etsi käyttäjän 1000 tiedostot
find ~ user petteri                              # etsi käyttäjän petteri tiedostot
find ~ -fprint ~/foo                             # kirjoita löytyneet tiedostoon ~/foo
sudo find / -type f -iname "*Trash"              # etsi mistä kaikkialta löytyy roskiksia - myös pääkäyttäjän roskikset tulostuu, samoinkuin
                                                 # roskikset muistitikulta ym.
find ~ -maxdepth 1 -empty -not -name ".*"        # etsi kotikansiosta nollakokoiset ei-piilotiedostot  (miksei pistettä slash:ata ? )
                                                  
                                                 # tiedoston nimessä voi olla on merkki /. Sellainen tiedosto on kylläkin käyttökelvoton eikä
                                                 # sen poistaminenkaan onnistu ihan noinvain. Inodet saa listattua käskyllä: ls -i  
find / -xdev -inum inode-numero                  # etsii missä se inode sijaitsee. Tuo xdev rajoittaa haun omaan tiedostojärjestelmään.
find ~ -inum inode-numero -exec rm {} \;         # tiedoston tai koko kansion poistaminen inoden perusteella; ls -i näyttää myös inode-numerot
find ~ -name "*.txt" cp {} {}.bkup \;            # tee tiedostoista bkup_it
find ~ -name \*conf > ~/asetustiedostot          # tee lista asetustiedostoista tiedostoon: ~/asetustiedostot

find ~  -type f -print0 | xargs -0 ls -lt | grep -v '/\.'                     # listaa kansio jättäen piilotiedostot pois ja esittäen uusimmat ensin
find ~ -name "*.file" -type f -print | xargs file | grep ASCII | cut -d: -f1  # tiedostolistaus jättäen pois binääritiedostot
find ~ -type f -print0 | xargs -0 du -h | sort -hr | head -20                 # listaa kaksikymmentä isointa tiedostoa ja kertoo niiden koot.

find ~ -type f -exec md5sum '{}' ';' | sort | uniq --all-repeated=separate -w 33 | cut -c 35-  # etsii tiedostot joilla on sama sisältö 
find ~/Lataukset -maxdepth 1 -type f | xargs md5sum                                            # kertoo ladattujen tiedostojen md5sum:mat ja nimet -> sha256sum
find mistä_kansiosta_eteenpäin_muutetaan -type f -exec sed -i "s/mikä/miksi/g" {} \; # muuta sana toiseksi polun kaikissa tiedostoissa
sudo find / ! -path /proc\* ! -path /run/user\* \( -nouser -o -nogroup  \)           # etsii tiedostot jotka eivät kuulu kenellekään. Jos 
                                                                                       niitä on on jossakin ongelmia, joskus pahojakin.
sudo find / -type f -mmin 1                      # listaa kaiki tiedostot joihin on kirjoitettu viimeisen minuutin aikana 
find ~/OMATSKRIPTIT -type f  -printf '%T@ %p\n' | grep -v ARKISTO | sort -n | tail -40 | cut -f2- -d" " # listaa 40 viimeisintä editointia
find OMATSKRIPTIT -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25 | cut -d ' ' -f5,10- # etsi 25 suurinta tiedostoa kansiosta OMATSKRIPTIT

- listauksissa on usein sellaista joka vain sekoittaa ja silloin kannattaakin käyttää suodatusta:
  Piilotiedostojen poistaminen listauksesta:              | grep -v /.          (piste kuuluu käskyyn)
  listaus yksinomaan nimistä joissa on kontrollimerkkejä: | grep *[[:cntrl:]]*  (jos konrollimerkkejä ei saa olla niin:[^[:cntrl:]])
- ellei jotain määrätä niin find on: lettaa eikä oletus ole aina miellyttävä. Esimerkiksi ellei ole määrättystä-lähtien etsitään niin find
  aloittaa etsimisen siitä kansiosta jossa ollaan. Ihan hyvä että toimii aina, mutta valitettavasti kun muulloin tulosteessa on koko polku
  niin oletushaku tulostaa polun alun muodossa ./ . Ja jos mitään suoritettava ei ole määrätty niin find olettaa että halutaan suorittaa 
  tulostus elikkä print - mutta jos määrätään joku  muu toimi niin print jää pois ellei erikseen print:tiä määrätä. Tai tavallisesti 
  tulostetaan sekä tiedostot että kansiot - mutta jos määrätään tulostamaan tiedostot niin kansioita ei tulosteta ellei erikseen määrätä.
- find löytää monesti niinpaljon asioita että tulostus tuntuu jatkuvan ikuisesti. Tulostuksen saa loppumaan kun painaa ctrl-c jolloin 
  palataan päätteeseen - senkertaisen find:in tulokset häviävät mutta muuta ei tapahdu.
- Linux on levykäyttöjärjestelmä; nykyään se on vain nimi, mutta aikoinaan käytäntö. Mutta se kertoo miksi find-ohjelma on edelleenkin tärkeä. 
-

Kaiken voi tehdä monella tavalla, eikä etukäteen voi tietää mikä tapa on tilanteeseen paras. Esimerkiksi kolme käskyä jotka tekee samaa asiaa,
ja varmasti on miljoona muutakin tapaa:
find / -name core | xargs /bin/rm -f
find / -name core -exec /bin/rm -f '{}' \; # tiedostonimissä saa olla välilyöntejä
find / -name core -delete  

find [directory] \
        -name "pattern_to_exclude" -prune \
     -o -name "another_pattern_to_exclude" -prune \
     -o -name "pattern_to_INCLUDE" -print0 \
| xargs -0 -I FILENAME grep -IR "pattern" FILENAME                
____________________________________________________________________________________________________________________________________________

Sitten teoriaa:

- optiota -mount kannattaa käyttää etsittäessä juuresta sillä se estää tutkimasta mountattuja - esimerkiksi proc|sys|dev kansioita.

find esittää tiedostopuun määrättävää osaa määrättävällä tavalla. Find-ohjelmaa kutsutaan seuraavasti:
find  mistä_kansiosta_lähtien_puu_esitetään  haun_rajaukset

- haut voi rajoittaa koskemaan vain tiedostoja ja/tai kansioita määreillä: -type f ja: -type d
- normaalisti hakua jatketaan niin monta tasoa kuin millä tiedostoja on. Joskus tasoja rajoitetaan määreellä: -depth <tasojen luku>
- voidaan rajoittaa haettavan nimeä. Koko nimikin voidaan antaa mutta yleensä määrätään mikä muoto nimellä tulee olla - esimerkiksi: -name *.html   
- voidaan hakea vain tietyn käyttäjän tai ryhmän tiedostoja määräämällä: -user käyttäjänimi      tai: -group ryhmän_nimi 
- mikä hyvänsä määre voidaan muuttaa vastakohdakseen kirjoittamalla sen eteen !  
- voidaan määrätä mitä tehdään löydetyille: -delete -exec {} 
 
find ~/OMATSKRIPTIT -type d -exec du -h  {} \; | sort -g        # listaus järjestelmän kansioista ja niiden tilankäytöstä järjestettynä niiden tilankäytön mukaan
~/OMATSKRIPTIT$ find ~/OMATSKRIPTIT -name *~ -exec rm -f  {} \; # järjetelmän back-uppien poisto
 find ~/OMATSKRIPTIT -type d | grep ARKISTO | grep -v ARKISTO/ | grep -v OMATSKRIPTIT/ARKISTO -exec rm -R  {} \;  ?

      


# edellinen käsky muuttaa välittämättä siitä mitä vaihdettavan edessä ja perässä on. Seuraava kolmilauseinen käsky olettaa että
 muutettavan sanan edessä ja perässä on välilyönti. Tämä vastaa määritelmää: sana. Koska sana voi myös alkaa tai lopettaa lauseen
 täytyy ennen muutoksia jokaisen rivin alkuun ja loppuun lisätä välilyönti ja muutoksien tekemisen jälkeen ne tulee poistaa. 

find mistä -type f -exec sed -i 's/^ */\ /g;s/ *$/\ /g' {} \;   # tiedostojen rivien eteen ja perään lisätään välilyönti; 
find mistä -type f -exec sed -i "s/\ mikä\ /\ miksi\ /g"  {} \; # sanojen muutokset tiedostoissa;
find mistä -type f -exec sed -i 's/^\ //g;s/\ $//g' {} \;       # tiedostojen rivien alusta ja lopusta poistetaan lisätty välilyönti

- siis etsittävän eteen ja perään ei yritetä liittää välilyöntiä; ne välilyönnit ovat muutettavassa tekstissä.
- tämä epämääräisyys on puhutun kielen ja kielioppien epämääräisyyttä ja koskevat millähyvänsä kielellä tehtyä ohjelmaa ja myös
 valmisohjelmia. 
- edelliset kolme lausetta voi supistaa yhdeksi, mutta silloin selväpiirteisyys katoaa. 

Mutta ei homma tähän lopu. Mahdollisuuksia on noin ziljoona. Pitäisi tehdä ohjelma jossa muutokset tehdään editorissa luvan jälkeen,
se kelpaisi useimmiten.
Ja mikäli muutokset lukee tiedostosta tulee lisää epämääräisyyksiä elikkä automaatti-katastrofeja.

find ~/ -name 'core*' -exec rm {} \;                   # poistaa kaikki core nimiset
find ~ -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \; # etsi kaikki IP:n kaltaiset ~ kansion tiedostoista
find /home/petteri/OMATSKRIPTIT -type f -exec md5sum '{}' ';' | grep -v ARKISTO | sort | uniq --all-repeated=separate -w 33 | cut -c 35-  # etsi duplikaatit md5sum:man perusteella
find . -printf '%s %p\n'|sort -nr|head # tulostaa kymmenen suurinta tiedostoa - ensksi tiedoston koon ja sitten nimen. Sitä voi mukaella: find <mistä tiedostopolusta listauksen haluat> .....
sudo find / \( -nouser -o -nogroup \) # koneessa ei pitäisi olla tiedostoja jotka eivät kuulu kellekään.
find . ! -name \*.md5 -exec 'md5sum "{}" > "{}".md5' \; # tee kaikille tiedostoille md5sum
find . ! -name "$(printf '*[\001-\037\177]*')" # listaa tiedostonimet ohittaen tiedostonimet joissa on kontrollimerkkejä (tab, newline ...)

find . -name "*.java" | xargs grep "Stock"
find . -type f | wc -l                                 # tiedostojen luku nykyisessä- ja sen alikansioissa
apuu=$(cat $kanta/"$KansionNimi"/"$ValitunTeksti" | awk '{print $1}'); [[ $(echo ${apuu:2:5}) = "/bin/" ]] &&
file -ib "$file"
if [ $(mimetype -d "$MyFile") == "text/plain")
find . -regex '.*\(h\|cpp\)'      # etsi tiedostot joiden peräliite on h tai cpp
finame(){ find . -iname "*$1*"; } # etsii kaikki tiedostot joiden nimessä on osana annettu nimi välittämättä kirjainkoosta
find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;


ongelma: kansio historia kastettiin uudestaan HISTORIA:ksi. Tiedostopuussa oli senjäljiltä mielettömän monta historia nimistä kansiota. Kuinka niistä pääsisi eroon ? 
käsky: find /home/petteri/OMATSKRIPTIT -name historiat -delete   ei onnistu, sillä se antaa tuloksiksi kansiot eikä niitä voi deletoida ennen tiedostoja.
find-käskyn -name ei hyväksy merkkiä / mutta -wholename hyväksyy merkin / joten se poistaa tiedostot: find /home/petteri/OMATSKRIPTIT -wholename */historiat/* -delete
nyt onnistuu käsky: find /home/petteri/OMATSKRIPTIT -name historiat -delete

Haluat tietää mitä kaikkea muistitikullasi on. Käsky on seurava:
find /media/petteri/tikku -type f -exec file -b '{}' \; -printf '%s\n' | awk -F , 'NR%2 {i=$1} NR%2==0 {a[i]+=$1} END {for (i in a) printf("%12u %s\n",a[i],i)}' | sort -nr 
- käsky käy läpi koko muistitikun, joten se kestää todella kauan. Tulosteessa on vaikka mitä, pitäneekö kutinsa.

Haluat muuttaa sanan toiseksi koko tie    find "$1" -type d -exec ./scriptname '{}' \;

    New:
    Code:

    find "$1" -type d -print0 | xargs -0 -n 1 -P 4 ./scriptname

    The -print0 in the find command and -0 option in xargs help to deal with filenames that have spaces and other special characters in them. The -n 1 refers to how many arguments to pass per process, and -P 4 is how many processes to execute concurrently.

    Oh, and for a small set of directories the time difference was 1min20secs vs 19secs 

dostojärjestelmässä:
find <mydir> -type f -exec sed -i 's/mikä/miksi/g' {} +
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
**
    find "$1" -type d -exec ./scriptname '{}' \;

    New:
    Code:

    find "$1" -type d -print0 | xargs -0 -n 1 -P 4 ./scriptname

    The -print0 in the find command and -0 option in xargs help to deal with filenames that have spaces and other special characters in them. The -n 1 refers to how many arguments to pass per process, and -P 4 is how many processes to execute concurrently.

    Oh, and for a small set of directories the time difference was 1min20secs vs 19secs 



