Bestanden en mappen vinden in Linux

In Linux-besturingssystemen kan de opdracht find worden gebruikt om naar bestanden en directory's op uw computer te zoeken. Als u wilt doorgaan, selecteert u een link in de volgende lijst of doorloopt u elke sectie op volgorde.

Opmerking: om find te gebruiken, begint u met het openen van een terminalsessie om toegang te krijgen tot de opdrachtregel.

Basisfunctionaliteit van find

Als u Zoeken zonder opties uitvoert, wordt een lijst met alle bestanden en directory's weergegeven in en onder de werkdirectory. Als uw werkmap bijvoorbeeld / home / hope / Documents is, wordt het volgende uitgevoerd door running find :

  • Elk bestand in / home / hoop / documenten .
  • Elke submap in / home / hoop / documenten .
  • Elk bestand in elk van die submappen.

Laten we het in actie zien. Laten we eerst onze werkdirectory controleren met de opdracht pwd:

pwd

 / Home / hoop / Documents 

Laten we nu zoeken zonder opties:

vind

 . ./images ./images/hp ./images/hp/snape.jpg ./images/hp/harry.jpg ./images/memes ./images/memes/winteriscoming.jpg ./images/memes/goodguygary.JPG. /images/memes/picard.jpg ./gimp-2.8.16.tar.bz2 ./hp-fanfic ./hp-fanfic/malfoys-revenge.doc ./hp-fanfic/weekend-at-hagreds.doc ./ hp-fanfic / dumbledores-lament.doc ./archlinux-2016.02.01-dual.iso 

In dit voorbeeld zien we in totaal tien bestanden en vier submappen in en onder onze map Documenten .

Merk op dat de uitvoer begint met een enkele punt, die de werkdirectory vertegenwoordigt. Het uitvoeren van zoeken zonder opties is hetzelfde als opgeven dat de zoekopdracht moet beginnen in de werkdirectory, zoals deze:

vind .

Het bovenstaande voorbeeld is de "juiste" manier om find te gebruiken. Als je het op een ander UNIX-achtig besturingssysteem zoals FreeBSD probeert te gebruiken, zul je zien dat het opgeven van een map vereist is, dus het is een goede gewoonte om deze vorm van de opdracht te gebruiken.

Specificeren waar te zoeken

Om alleen de bestanden en submappen die zich in de map / home / hope / Documents / images bevinden weer te geven, geeft u dit op als het eerste argument van de opdracht:

vind / home / hoop / Documenten / afbeeldingen

 / home / hoop / Documenten / afbeeldingen / home / hoop / Documenten / afbeeldingen / hp /home/hope/Documents/images/hp/snape.jpg /home/hope/Documents/images/hp/harry.jpg / home / hoop / Documenten / afbeeldingen / memes /home/hope/Documents/images/memes/winteriscoming.jpg /home/hope/Documents/images/memes/goodguygary.JPG /home/hope/Documents/images/memes/picard.jpg 

Merk op dat het volledige pad ook in de resultaten wordt getoond.

Als onze werkdirectory / home / hope / Documents is, kunnen we de volgende opdracht gebruiken, die dezelfde bestanden vindt:

vind ./afbeeldingen

Maar deze keer geeft de uitvoer de startlocatie van de zoekopdracht weer en ziet er als volgt uit:

 ./images ./images/hp ./images/hp/snape.jpg ./images/hp/harry.jpg ./images/memes ./images/memes/winteriscoming.jpg ./images/memes/goodguygary.JPG. /images/memes/picard.jpg 

Standaard wordt de zoekopdracht in elke subdirectory van uw startlocatie weergegeven. Als u wilt beperken hoeveel niveaus van subdirectory u wilt zoeken, kunt u de optie -maxdepth gebruiken met een cijfer.

Als u bijvoorbeeld opgeeft dat -maxdepth 1 alleen in de map zoekt waar het zoeken begint. Als er submappen worden gevonden, worden deze weergegeven, maar niet doorzocht.

vind . -maxdepth 1

 . ./images ./bigfiles.txt ./gimp-2.8.16.tar.bz2 ./hp-fanfic ./archlinux-2016.02.01-dual.iso 

Als u -maxdepth 2 opgeeft, doorzoekt u de map en één submap diep:

vind . -maxdepth 2

 . ./images ./images/hp ./images/memes ./gimp-2.8.16.tar.bz2 ./hp-fanfic ./hp-fanfic/malfoys-revenge.doc ./hp-fanfic/weekend-at- hagreds.doc ./hp-fanfic/dumbledores-lament.doc ./archlinux-2016.02.01-dual.iso 

Als u -maxdepth 3 opgeeft, zoekt u een niveau dieper dan dat:

vind . -maxdepth 3

 . ./images ./images/hp ./images/hp/snape.jpg ./images/hp/harry.jpg ./images/memes ./images/memes/winteriscoming.jpg ./images/memes/goodguygary.JPG. /images/memes/picard.jpg ./gimp-2.8.16.tar.bz2 ./hp-fanfic ./hp-fanfic/malfoys-revenge.doc ./hp-fanfic/weekend-at-hagreds.doc ./ hp-fanfic / dumbledores-lament.doc ./archlinux-2016.02.01-dual.iso 

Zoeken op naam

Om uw zoekresultaten te beperken tot alleen bestanden en mappen die een bepaalde naam hebben, gebruikt u de optie -name en plaatst u de naam tussen aanhalingstekens:

vind . -name "picard.jpg"

 ./images/memes/picard.jpg 

U kunt ook jokertekens gebruiken als onderdeel van uw bestandsnaam. Als u bijvoorbeeld alle bestanden wilt vinden waarvan de naam eindigt op .jpg, kunt u een asterisk gebruiken om de rest van de bestandsnaam weer te geven. Wanneer u de opdracht uitvoert, zal de shell de bestandsnaam omzetten in iets dat overeenkomt met het patroon:

vind . -name "* .jpg"

 ./images/hp/snape.jpg ./images/hp/harry.jpg ./images/memes/winteriscoming.jpg ./images/memes/picard.jpg 

Merk op dat onze opdracht niet het bestand bevat waarvan de extensie ( JPG ) in hoofdletters is. Dat komt omdat in tegenstelling tot andere besturingssystemen, zoals Microsoft Windows, Linux-bestandsnamen hoofdlettergevoelig zijn.

Gebruik in plaats daarvan de optie -iname om een ​​niet-hoofdlettergevoelige zoekopdracht uit te voeren:

vind . -iname "* .jpg"

 ./images/hp/snape.jpg ./images/hp/harry.jpg ./images/memes/winteriscoming.jpg ./images/memes/goodguygary.JPG ./images/memes/picard.jpg 

Alleen bestanden of alleen mappen zoeken

Als u alleen bestanden wilt weergeven en mapnamen uit uw resultaten wilt weglaten, geeft u -type f op :

vind . type f

 ./images/hp/snape.jpg ./images/hp/harry.jpg ./images/memes/winteriscoming.jpg ./images/memes/goodguygary.JPG ./images/memes/picard.jpg ./gimp-2.8 .16.tar.bz2 ./hp-fanfic/malfoys-revenge.doc ./hp-fanfic/weekend-at-hagreds.doc ./hp-fanfic/dumbledores-lament.doc ./archlinux-2016.02.01-dual .iso 

Als u alleen mappen wilt weergeven en bestandsnamen wilt weglaten, geeft u -type d op :

vind . type d

 . ./images ./images/hp ./images/memes ./hp-fanfic 

Bestanden zoeken op basis van grootte

Om alleen bestanden van een bepaalde grootte weer te geven, kunt u de optie -maat gebruiken. Gebruik een plus- of minteken (voor 'meer dan' of 'minder dan'), een getal en een kwantitatief achtervoegsel zoals k, M of G om de grootte op te geven.

Om bijvoorbeeld bestanden te vinden die "groter zijn dan 50 kilobytes", gebruik -size + 50k :

vind . -maat + 50k

 ./images/memes/winteriscoming.jpg ./gimp-2.8.16.tar.bz2 ./archlinux-2016.02.01-dual.iso 

Voor bestanden "groter dan 10 megabytes", gebruik -size + 10M :

vind . -maat + 10M

 ./gimp-2.8.16.tar.bz2 ./archlinux-2016.02.01-dual.iso 

Gebruik -size + 1G voor "groter dan 1 gigabyte":

vind . -maat + 1G

 ./archlinux-2016.02.01-dual.iso 

Gebruik voor bestanden in een bepaald groottebereik twee- formaatopties . Als u bijvoorbeeld bestanden wilt vinden die "groter zijn dan 10 megabytes, maar kleiner dan 1 gigabyte", geeft u -size + 10M -size -1G op :

vind . -maat + 10M -size -1G

 ./gimp-2.8.16.tar.bz2 

Bestanden zoeken op basis van wijziging, toegang of statuswijziging

Met de optie -time wordt het zoeken beperkt door het aantal dagen sinds de inhoud van het bestand is gewijzigd. Gebruik een negatief getal om dagen in het verleden te specificeren. Als u bijvoorbeeld alleen die bestanden wilt vinden die in de afgelopen twee dagen zijn gewijzigd (48 uur geleden), gebruikt u -mtime -2 :

vind . -mtime -2

De -mmin optie doet hetzelfde, maar in termen van minuten, niet dagen. Deze opdracht toont bijvoorbeeld alleen bestanden die in het afgelopen half uur zijn gewijzigd:

vind . -mmin -30

Een vergelijkbare optie is -ctime, die controleert wanneer de status van een bestand voor het laatst is gewijzigd, gemeten in dagen. Een statuswijziging is een wijziging van de metadata van het bestand. Het wijzigen van de machtigingen van een bestand is bijvoorbeeld statusverandering.

De optie -cmin zoekt naar een statuswijziging, gemeten in minuten.

U kunt ook zoeken wanneer een bestand voor het laatst is geopend, met andere woorden wanneer de inhoud ervan het laatst werd bekeken. De optie -time wordt gebruikt om te zoeken naar bestanden op basis van hun meest recente toegangstijd, gemeten in dagen.

De optie -amin voert dezelfde zoekrestrictie uit, maar wordt gemeten in minuten.

Uitvoer naar een tekstbestand omleiden

Als u een zeer grote zoekopdracht uitvoert, wilt u misschien uw zoekresultaten opslaan in een bestand, zodat u de resultaten later kunt bekijken. U kunt dit doen door uw zoekuitvoer om te leiden naar een bestand:

vind . -iname "* .jpg"> images.txt

U kunt uw resultaten vervolgens openen in een teksteditor of ze afdrukken met het commando cat .

cat images.txt

 ./images/hp/snape.jpg ./images/hp/harry.jpg ./images/memes/winteriscoming.jpg ./images/memes/goodguygary.JPG ./images/memes/picard.jpg 

Als alternatief kunt u uw uitvoer naar de tee- opdracht leiden, die de uitvoer naar het scherm zal afdrukken en naar een bestand zal schrijven:

vind . -size + 500M | tee bigfiles.txt

 ./archlinux-2016.02.01-dual.iso 

cat bigfiles.txt

 ./archlinux-2016.02.01-dual.iso 

Foutmeldingen onderdrukken

Mogelijk krijgt u het foutbericht "Toestemming geweigerd" bij het uitvoeren van een zoekopdracht. Als u bijvoorbeeld de hoofdmap zoekt als een normale gebruiker:

vind /

 zoek: `/ var / lib / sudo / ts ': toestemming geweigerd vinden:` / var / lib / sudo / docured': toestemming geweigerd vinden: `/ var / lib / polkit-1 ': toestemming geweigerd vinden:` / var / lib / container ': toestemming geweigerd vinden: `/var/lib/gdm3/.dbus': toestemming geweigerd vinden:` /var/lib/gdm3/.config/ibus ': toestemming geweigerd ... 

U ontvangt dat foutbericht als find probeert toegang te krijgen tot een bestand dat uw gebruikersaccount niet mag lezen. Mogelijk kunt u de zoekopdracht uitvoeren als de superuser ( root ), die volledige toegang heeft tot elk bestand op het systeem. Maar het is niet aan te raden om dingen als root te doen, tenzij er geen andere opties zijn.

Als alles wat u hoeft te doen is de "toestemming geweigerd" berichten te verbergen, kunt u 2 &> 1 | toevoegen grep -v "Toestemming geweigerd" tot het einde van uw opdracht, zoals dit:

zoek / 2> & 1 | grep -v "toestemming geweigerd"

Het bovenstaande voorbeeld filtert de "Permission denied" -berichten uit uw zoekopdracht. Hoe?

2> & 1 is een speciale omleiding die foutmeldingen naar de standaarduitvoer stuurt om de gecombineerde regels van de uitvoer naar de grep- opdracht te leiden. grep -v voert dan een omgekeerde overeenkomst uit op "Toestemming geweigerd" en geeft alleen regels weer die die reeks niet bevatten.

Het omleiden en gebruiken van grep om de foutmeldingen te filteren is een nuttige techniek wanneer "Machtiging geweigerd" uw zoekresultaten overrompelt en u de zoekopdracht niet als root kunt uitvoeren.

Voorbeelden

zoek ~ /. -name "* .txt" -amin -120

Zoek alle bestanden in je thuismap en onder dat einde in de extensie " .txt ". Toon alleen bestanden die in de afgelopen twee uur zijn geopend.

vind . -name "* .zip" -size + 10M -mtime -3

Zoek alle bestanden in de werkdirectory en onder wiens naam de extensie " .zip " heeft en waarvan de grootte groter is dan 10 megabytes. Toon alleen bestanden waarvan de inhoud in de laatste 72 uur is gewijzigd.

vind . -iname "* report *" -type f -maxdepth 2

Voer een niet-hoofdlettergevoelige zoekopdracht uit naar bestanden die het woord ' rapport ' in hun naam bevatten. Als de zoekopdracht een map met "rapport" in de naam vindt, moet u deze niet weergeven. Zoek alleen in de werkdirectory en één directoryniveau eronder.

find / -name "* init *" 2> & 1 | grep -v "toestemming geweigerd" | tee ~ / initfiles.txt

Zoek alle bestanden op het systeem waarvan de naam " init " bevat, onderdrukking van foutmeldingen. Geef de resultaten op het scherm weer en voer ze uit naar een bestand in uw thuismap met de naam " initfiles.txt ".