Voer meerdere bewerkingen in Linux uit met het 'xargs'-commando
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.