Linux

Vinden van bestanden

find and globbing

Leerdoelen

  • We gaan bestanden zoeken op een Linux systeem
  • Met de volledige naam
  • Maar ook als we maar een deel van de naam weten (de extensie)

find (1)

  • find is een bijzonder commando met een speciale syntax
    find <path> <options> <action>
  • Zoekt bestanden in een directory structuur
  • find zoekt recursief: hij doorloopt alle directories en subdirectories in het opgegeven path

find (2)

find ~/Documents -name "test.txt" -print
  • Het pad (path) geeft aan waarin we zoeken
    • zoekt in ~/Documents
  • Options geven aan waarnaar we zoeken
    • naar een bestand met de naam test.txt
  • Acties vertellen wat find moet doen
    • -print is de standaard actie, we mogen hem weg laten
      find ~/Documents -name "test.txt"

Werken met find

  • Zoeken naar het bestand man.1.gz
    find /usr/share/man/ -name "man.1.gz"
  • Zoekt in de directory /usr/share/man en alle subdirectories naar alle man.1.gz bestanden
  • Verklaar de uitvoer die je hebt gekregen

Globbing

  • Stel dat je niet helemaal meer weet hoe een bestand heet, dan gebruik je globbing
  • Globbing is een functie van de shell om bestandsnamen aan te vullen
  • Het vervangen van willekeurige karakters door wildcards (*,?)
  • Wildcards vullen stukken in die we niet zeker weten

Asterisk

  • *: het staat voor 0 of meer characters
  • a*b kan dus zijn:
    • ab
    • azb
    • a8b
    • a#b
    • afshfhkajragwhrwhhewakjb
    • acdsayf84w762068092%$$#%4344hjgjjkhjjb
  • Zolang de bestandsnaam maar begint met een a en eindigt met een b

Werken met de asterisk

  • * – nul of meer characters
    find /usr/share/man/ -name "*1"
  • Dit vindt elk bestand dat eindigt met een 1
  • De uitkomst zijn alle man1 directories
  • In elke taal-subdirectory op het systeem

Vraagteken

  • ?: staat voor één enkel onbekend character
  • man.?.gz kan dus zijn:
    • man.a.gz
    • man.#.gz
    • man.1.gz
    • Maar niet man..gz, want er moet een character staan

Werken met het vraagteken

find /usr/share/man/man? -name "passwd.?.gz"
  • We zien een wildcard in het path en in de te zoeken bestandsnaam
  • Het vindt passwd.1.gz en passwd.5.gz
  • In verschillende directories
    • Welke directories zijn dit?
    • Welke hoofdstukken gaat de manual over?
    • Tip: man man

Reeksen

  • […] – zoek naar alle characters die … matchen
    • [1234] matched 1, 2, 3 en 4
    • [0123456789] kan makkelijker met:
      • [0-9] is 0 tot en met 9
    • [a-z] is a tot en met z
    • [A-Z] is A tot en met Z
    • Reeksen mogen gecombineerd worden
      • [a-zA-Z]

Werken met reeksen (1)

  • find /usr/share/man/nl/ -name "man[12]"
    • Vindt alleen man1
  • find /usr/share/man/nl/ -name "man[12345678]"
    • Vindt man1, 5, 7 en 8
    • Makkelijker:
      find /usr/share/man/nl/ -name "man[1-8]"

Iets niet vinden

find /usr/share/man/nl/ -name "man[^125]"
  • Negatieve zoekopdracht: ^ is niet
    • Vindt niet man1, man2 en man5
    • Vindt man7 en 8
  • ^ moet binnen de blokhaken staan.

Werken met reeksen (2)

  • En je kan combinaties maken
    find ~/Pictures -name "*.[Jj][Pp][Gg]" -print
  • Vind alle jpg’s ongeacht de spelling van de extensie

Meer dan alleen find

  • Globbing kan je gebruiken met alle commando’s die over bestanden gaan, zoals
    • ls
    • mkdir
    • rmdir
    • touch
    • ... etc.

Meer dan alleen print

  • -exec voert een commando uit
  • {} bevat het gevonden bestand
    find ~ -name data.bin -exec ls -l {} \;
  • Zoekt in je home directory naar data.bin
  • En doet een ls -l van de gevonden bestanden
  • De \; sluit de exec af! Na een -exec is dit nodig!
  • Een paar builtin functies: -delete

Samenvatting

  • We hebben leren werken met find
    • find zoekt bestanden en directories
    • Met -exec kunnen we find vertellen om een actie uit te voeren op de gevonden bestanden
  • We hebben leren werken met globbing:
    • We hebben de wildcards * en ? gezien
    • We hebben gewerkt met reeksen