Xargs is een nuttige opdracht die fungeert als een brug tussen twee opdrachten, waarbij de uitvoer van de ene wordt gelezen en de andere wordt uitgevoerd terwijl de items worden gelezen. De opdracht wordt meestal gebruikt in scenario's wanneer een gebruiker op zoek is naar een patroon, bestanden verwijdert en hernoemt, en meer.

In de basisvorm leest xargs informatie uit de standaardinvoer (of STDIN) en voert een of meerdere keren een opdracht uit terwijl de items worden gelezen.

Ter illustratie, de volgende opdracht xargs verwacht dat de gebruiker een bestand of een xargs invoert:

 xargs ls -l 

Nadat een naam is ingevoerd, geeft de opdracht xargs die informatie door aan de ls opdracht.

Hier is de uitvoer van het hierboven getoonde xargs commando toen ik het vanuit mijn thuismap uitvoerde door "Documenten" (dat is een submap in mijn thuismap) als invoer in te voeren:

Merk op dat in dit geval de opdracht xargs opdracht ls met de directorynaam als een opdrachtregelargument heeft uitgevoerd om een ​​lijst met bestanden in die map te produceren.

Hoewel de opdracht xargs in verschillende bewerkingen op de opdrachtregel kan worden gebruikt, is deze erg handig bij gebruik met de opdracht find . In dit artikel bespreken we enkele handige voorbeelden om te begrijpen hoe xargs en find kunnen worden gebruikt.

Bewerkingen met meerdere bestanden

Stel dat u de inhoud van "ref.txt" naar alle TXT-bestanden in een map wilt kopiëren. Hoewel de taak anders misschien vereist dat u meerdere opdrachten uitvoert, maakt de opdracht xargs, samen met de opdracht find, het eenvoudig.

Voer gewoon de volgende opdracht uit:

 zoek ./ -name "* .txt" | xargs -n1 cp ../ref.txt 

Om de bovenstaande opdracht te begrijpen, laten we deze in twee delen verdelen.

Het eerste deel is find ./ -name "*.txt", dat zoekt naar alle .txt-bestanden in de huidige map.

Het tweede deel xargs -n1 cp ../ref.txt de uitvoer van de eerste opdracht (de resulterende bestandsnamen) en geeft deze één voor één door aan de cp (kopie) xargs -n1 cp ../ref.txt . Merk op dat de optie -n hier cruciaal is, omdat xargs om één argument per uitvoering te gebruiken.

Wanneer ze samen worden gecombineerd, kopieert de volledige opdracht de inhoud van "ref.txt" naar alle TXT-bestanden in de map.

Operaties met veel argumenten

Een van de belangrijkste voordelen van het gebruik van xargs is de mogelijkheid om een ​​groot aantal argumenten te verwerken. Tijdens het verwijderen van een groot aantal bestanden in één keer, bijvoorbeeld, mislukt de opdracht rm soms met de foutmelding " Te lange lijst van argumenten ". Dat komt omdat het zo'n lange lijst met argumenten niet eenvoudig aankan. Dit is meestal het geval wanneer u te veel bestanden in de map hebt die u wilt verwijderen.

Dit kan eenvoudig worden opgelost met xargs . Om al deze bestanden te verwijderen, gebruikt u de volgende opdracht:

 zoek ./rm-test/ -name "*" -print | xargs rm 

Bewerkingen met zoeken in patronen

Zowel softwareontwikkelaars als systeembeheerders doen veel patroononderzoek tijdens het werken op de opdrachtregel. Een ontwikkelaar wil bijvoorbeeld snel de projectbestanden bekijken die een bepaalde variabele wijzigen, of een systeembeheerder wil mogelijk de bestanden zien die een bepaalde systeemconfiguratieparameter gebruiken. In deze scenario's maken xargs, samen met find en grep, het u gemakkelijk.

Als u bijvoorbeeld wilt zoeken naar alle TXT-bestanden die de tekenreeks "maketecheasier" bevatten, voert u de volgende opdracht uit:

 $ find ./ -name "* .txt" | xargs grep "maketecheasier" 

Hier is de uitvoer van het commando geproduceerd op mijn systeem:

Knippen / kopiëren bewerkingen

Xargs, samen met de opdracht find, kunnen ook worden gebruikt om een ​​reeks bestanden van de ene naar de andere directory te kopiëren of te verplaatsen. Als u bijvoorbeeld alle tekstbestanden die meer dan 10 minuten oud zijn van de huidige map naar de vorige map wilt verplaatsen, gebruikt u de volgende opdracht:

 vind . -name "* .txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../ 

De optie -I opdrachtregel wordt gebruikt door de opdracht xargs om een ​​replace-string te definiëren die wordt vervangen door namen die worden gelezen van de uitvoer van de opdracht find . Hier is de replace-string {}, maar het kan van alles zijn. U kunt bijvoorbeeld "bestand" als een vervangende tekenreeks gebruiken.

 vind . -name "* .txt" -mmin 10 | xargs -n1 -I 'bestand' mv 'file' ./practice 

Hoe xargs te vertellen wanneer te stoppen

Stel dat u de details wilt weergeven van alle TXT-bestanden in de huidige map. Zoals al uitgelegd, kan het gemakkelijk worden gedaan met behulp van de volgende opdracht:

 vind . -name "* .txt" | xargs ls -l 

Maar er is één probleem; de opdracht xargs voert de opdracht ls uit, zelfs als de opdracht find geen .txt-bestand kan vinden. Hier is een voorbeeld:

Dus je kunt zien dat er nee is. txt- bestanden in de map, maar dat hield niet op dat xargs de opdracht ls uitvoeren. Gebruik de opdrachtregeloptie -r om dit gedrag te wijzigen:

 vind . -name "* .txt" | xargs -r ls -l 

Conclusie

Hoewel ik me hier heb geconcentreerd op het gebruik van xargs met find, kan het ook met veel andere opdrachten worden gebruikt. Ga door de hoofdpagina van het commando om er meer over te leren, en laat hieronder een opmerking achter als u twijfels of vragen hebt.