Hoe de find-opdracht in Linux te gebruiken

0
85
fatmawati achmad zaenuri/Shutterstock

Het Linux find-commando is geweldig in het zoeken naar bestanden en mappen. Maar u kunt de resultaten van de zoekopdracht ook doorgeven aan andere programma's voor verdere verwerking. We laten je zien hoe.

Het Linux find commando

Het Linux find commando is krachtig en flexibel. Het kan zoeken naar bestanden en mappen met behulp van een hele reeks verschillende criteria, niet alleen bestandsnamen. Het kan bijvoorbeeld zoeken naar lege bestanden, uitvoerbare bestanden of bestanden die eigendom zijn van een bepaalde gebruiker. Het kan bestanden vinden en weergeven op hun geopende of gewijzigde tijden, u kunt regex-patronen gebruiken, het is standaard recursief en het werkt met pseudo-bestanden zoals named pipes (FIFO-buffers).

GERELATEERDHoe alle Linux-zoekopdrachten te gebruiken

Alle dat is fantastisch handig. Het bescheiden zoekcommando heeft echt wat kracht. Maar er is een manier om die kracht te benutten en dingen naar een ander niveau te tillen. Als we de uitvoer van de opdracht find kunnen gebruiken en deze automatisch kunnen gebruiken als invoer van andere opdrachten, kunnen we iets laten gebeuren met de bestanden en mappen die voor ons gevonden worden.

Het principe van het pipen van de uitvoer van de ene opdracht naar een andere opdracht is een kernkenmerk van Unix-afgeleide besturingssystemen. Het ontwerpprincipe om een ​​programma één ding te laten doen en het goed te laten doen, en te verwachten dat de uitvoer de invoer van een ander programma zou kunnen zijn, zelfs een nog ongeschreven programma, wordt vaak beschreven als de 'Unix' filosofie.” En toch accepteren sommige kernprogramma's, zoals mkdir, geen doorgesluisde invoer.

GERELATEERDHoe het xargs-commando onder Linux te gebruiken

Om deze tekortkoming aan te pakken kan het xargs-commando worden gebruikt om doorgesluisde invoer te bundelen en in andere commando's in te voeren alsof het commandoregelparameters voor dat commando zijn. Hiermee wordt bijna hetzelfde bereikt als eenvoudig leidingwerk. Dat is “bijna hetzelfde” ding, en niet “precies hetzelfde” ding omdat er onverwachte verschillen kunnen zijn met shell-uitbreidingen en bestandsnaam globbing.

Find gebruiken met xargs

We kunnen find gebruiken met xargs om een ​​actie uit te voeren op de gevonden bestanden. Dit is een omslachtige manier om dit aan te pakken, maar we kunnen de bestanden die gevonden zijn door find in xargs invoeren, die ze vervolgens naar tar pijpt om een ​​archiefbestand van die bestanden te maken. We zullen deze opdracht uitvoeren in een map die veel PAGE-bestanden van het helpsysteem bevat.

find ./-name “*.page” -type f -print0 | xargs -0 tar -cvzf page_files.tar.gz

Het commando bestaat uit verschillende elementen.

  • vind ./-name “*.pagina” -type f -print0:  De zoekactie start in de huidige map, waarbij op naam wordt gezocht naar bestanden die overeenkomen met de “*.page” zoekreeks. Directory's worden niet weergegeven omdat we specifiek zeggen dat het alleen naar bestanden moet zoeken, met -type f. Het argument print0 vertelt find om witruimte niet te behandelen als het einde van een bestandsnaam. Dit betekent dat bestandsnamen met spaties correct worden verwerkt.
  • xargs -o: De -0 argumenten xargs om witruimte niet te behandelen als het einde van een bestandsnaam.
  • tar -cvzf page_files.tar.gz: dit is het commando dat xargs de bestandslijst van vinden tot gaat voeden. Het tar-hulpprogramma maakt een archiefbestand aan met de naam “page_files.tar.gz.”

Advertentie

We kunnen ls gebruiken om het archiefbestand te zien dat is gemaakt voor ons.

ls *.gz

Het archiefbestand is voor ons gemaakt. Om dit te laten werken, moeten alle bestandsnamen massaal aan tar worden doorgegeven, wat is gebeurd. Alle bestandsnamen werden aan het einde van de tar-opdracht getagd als een zeer lange opdrachtregel.

U kunt ervoor kiezen om de laatste opdracht op alle bestandsnamen tegelijk uit te voeren of één keer per bestandsnaam aan te roepen. We kunnen het verschil vrij gemakkelijk zien door de uitvoer van xargs naar het hulpprogramma wc voor het tellen van regels en tekens te sturen.

Dit commando stuurt alle bestandsnamen tegelijk naar wc. In feite construeert xargs een lange opdrachtregel voor wc met elk van de bestandsnamen erin.

find . -naam “*.pagina” -type f -print0 | xargs -0 wc

De regels, woorden en tekens voor elk bestand zijn afgedrukt, samen met een totaal van alle bestanden.

Advertentie

Als we xarg‘s  -I gebruiken (vervang string) optie en definieer een vervangende string-token—in ​​dit geval ” {}“—het token wordt in het laatste commando om de beurt vervangen door elke bestandsnaam. Dit betekent dat wc herhaaldelijk wordt aangeroepen, één keer voor elk bestand.

find . -naam “*.pagina” -type f -print0 | xargs -0 -I “{}” wc “{}”

De output is niet mooi uitgelijnd. Elke aanroep van wc werkt op een enkel bestand, dus wc heeft niets om de uitvoer mee af te stemmen. Elke regel uitvoer is een onafhankelijke regel tekst.

Omdat wc alleen een totaal kan geven als het op meerdere bestanden tegelijk werkt, krijgen we de samenvattende statistieken niet.

De find -exec Optie

De opdracht find heeft een ingebouwde methode om externe programma's aan te roepen om verdere verwerking uit te voeren op de bestandsnamen die worden geretourneerd. De optie -exec (execute) heeft een syntaxis die lijkt op, maar verschilt van de opdracht xargs.

find . -naam “*.pagina” -type f -exec wc -c “{}” ;

Dit telt de woorden in de overeenkomende bestanden. Het commando bestaat uit deze elementen.

  • vind .: Start het zoeken in de huidige directory. De opdracht find is standaard recursief, dus er wordt ook in submappen gezocht.
  • -name “*.page”: We zijn op zoek naar bestanden met namen die overeenkomen met de “*.pagina” zoekreeks.
  • -type f: we zoeken alleen naar bestanden, niet naar mappen.
  • -exec wc: We gaan het wc-commando uitvoeren op de bestandsnamen die overeenkomen met de zoekreeks.
  • -w: Alle opties die u aan de opdracht wilt doorgeven, moeten direct na de opdracht worden geplaatst.
  • “{}”: De “{ }” placeholder staat voor elke bestandsnaam en moet het laatste item in de parameterlijst zijn.
  • ;: Een puntkomma “;” wordt gebruikt om het einde van de parameterlijst aan te geven. Het moet worden ontsnapt met een backslash “” zodat de shell het niet interpreteert.

Wanneer we dat commando uitvoeren, zien we de uitvoer van wc. De -c (byte count) beperkt de uitvoer tot het aantal bytes in elk bestand.

Advertentie

Zoals je kunt zien is er geen totaal. Het wc-commando wordt één keer per bestandsnaam uitgevoerd. Door een plusteken “+” voor de afsluitende puntkomma “;” we kunnen het gedrag van -exec‘s veranderen zodat het op alle bestanden tegelijk werkt.

find . -name “*.page” -type f -exec wc -c “{}” +

< /p>

We krijgen het totaal en netjes getabelleerde resultaten die ons vertellen dat alle bestanden als één lange opdrachtregel aan wc zijn doorgegeven.

exec betekent echt exec

De optie -exec (execute) start de opdracht niet door deze in de huidige shell uit te voeren. Het gebruikt de ingebouwde exec van Linux om de opdracht uit te voeren, waarbij het huidige proces "uw shell" wordt vervangen door de opdracht. Dus de opdracht die wordt gestart, wordt helemaal niet in een shell uitgevoerd. Zonder shell kun je geen shell-uitbreiding van jokertekens krijgen en heb je geen toegang tot aliassen en shell-functies.

Deze computer heeft een shell-functie die alleen woorden wordt genoemd. Dit telt alleen de woorden in een bestand.

function words-only () {   wc -w $1 } GERELATEERDHoe aliassen en shell-functies te maken op Linux

Een vreemde functie misschien, “words-only” is veel langer om te typen dan “wc -w” maar het betekent in ieder geval dat je de opdrachtregelopties voor wc niet hoeft te onthouden. We kunnen testen wat het doet als volgt:

alleen woorden user_commands.pages

Dat werkt prima met een normale opdrachtregelaanroep. Als we die functie proberen aan te roepen met de optie find's -exec, zal het mislukken.

vinden . -naam “*.pagina” -type f -exec alleen woorden “{}” ;

Advertentie

De opdracht find kan de shell niet vinden functie, en de -exec actie mislukt.

Om dit te verhelpen, kunnen we een Bash-shell starten en de rest van de opdrachtregel eraan doorgeven als argumenten voor de shell. We moeten de opdrachtregel tussen dubbele aanhalingstekens plaatsen. Dit betekent dat we de dubbele aanhalingstekens rond de “{}” vervang string.

Voordat we het find commando kunnen uitvoeren, moeten we onze shell-functie exporteren met de -f (als een functie) optie:

export -f words-only find . -name “*.page” -type f -exec bash -c “alleen woorden “{}”” ;

Dit werkt zoals verwacht.

De bestandsnaam meer dan eens gebruiken

Als u meerdere opdrachten aan elkaar wilt koppelen, kunt u dat doen, en u kan de “{}” vervang string in elke opdracht.

find . -name “*.page” -type f -exec bash -c “basename “{}” && alleen woorden “{}”” ;

Als we een niveau hoger komen dan de “pagina's” directory en voer dat commando uit, find zal nog steeds de PAGE-bestanden ontdekken omdat het recursief zoekt. De bestandsnaam en het pad worden net als voorheen doorgegeven aan onze functie voor alleen woorden. Puur om het gebruik van -exec met twee commando's te demonstreren, roepen we ook het commando basename aan om de naam van het bestand te zien zonder het pad.

Zowel het commando basename als de shell-only shell functie hebben de bestandsnamen aan hen doorgegeven met behulp van een “{}” string vervangen.

Paarden voor cursussen

Er is een CPU-belasting en tijdstraf voor het herhaaldelijk aanroepen van een commando terwijl je het één keer zou kunnen aanroepen en alle bestandsnamen er in één keer aan zou kunnen doorgeven. En als je elke keer een nieuwe shell aanroept om de opdracht te starten, wordt die overhead erger.

Advertentie

Maar soms—afhankelijk van wat je probeert te bereiken& #8212;je hebt misschien geen andere optie. Welke methode je situatie ook vereist, niemand zou verbaasd moeten zijn dat Linux genoeg opties biedt om degene te vinden die bij je specifieke behoeften past.

LEES VOLGENDE

  • › Herinnering aan VRML: The Metaverse of 1995
  • › Welke 8K-content is daadwerkelijk beschikbaar?
  • › How-To Geek's Best of CES 2022 Award-winnaars: waar we enthousiast over zijn
  • › Wat doet “NBD” Gemiddeld, en hoe gebruik ik het?
  • › Werken Blue Light-brillen? Alles wat u moet weten
  • › Niets nuttigs komt van hersenloos scrollen