Πώς να χρησιμοποιήσετε την εντολή xargs στο Linux

Θέλετε να συνδυάσετε μερικές εντολές Linux μαζί, αλλά μία από αυτές δεν δέχεται είσοδο με σωλήνωση; Το xargs μπορεί να πάρει την έξοδο από μια εντολή και να την στείλει σε μια άλλη εντολή ως παραμέτρους.

Όλα τα τυπικά βοηθητικά προγράμματα Linux έχουν τρεις ροές δεδομένων συνδέονται μαζί τους. Είναι η τυπική ροή εισόδου (stdin), η τυπική ροή εξόδου (stdout) και η τυπική ροή σφαλμάτων (stderr).

Αυτές οι ροές λειτουργούν με κείμενο. Στέλνουμε είσοδο (stdin) σε μια εντολή χρησιμοποιώντας κείμενο και η απάντηση (stdout) γράφεται στο παράθυρο του τερματικού ως κείμενο. Τα μηνύματα σφάλματος γράφονται επίσης στο παράθυρο του τερματικού ως κείμενο (stderr).

Ένα από τα σπουδαία χαρακτηριστικά των λειτουργικών συστημάτων Linux και Unix είναι η δυνατότητα διοχέτευσης της εξόδου stdout από μία εντολή στην είσοδο stdin μιας δεύτερης εντολής. Η πρώτη εντολή δεν ενδιαφέρεται που η έξοδός της δεν πηγαίνει σε ένα παράθυρο τερματικού και η δεύτερη εντολή δεν ενδιαφέρεται που η είσοδός της δεν προέρχεται από ένα πληκτρολόγιο.

Αν και όλες οι εντολές Linux έχουν τις τρεις τυπικές ροές, δεν δέχονται όλες το stdout μιας άλλης εντολής ως είσοδο στο stdin τους. Αυτό σημαίνει ότι δεν μπορείτε να τους διοχετεύσετε είσοδο.

Το xargs είναι μια εντολή για την κατασκευή αγωγών εκτέλεσης χρησιμοποιώντας τις τυπικές ροές δεδομένων. Χρησιμοποιώντας xargs μπορούμε να κάνουμε εντολές όπως echo, rm και mkdir να δέχονται την τυπική είσοδο ως ορίσματα.

Η εντολή xargs

Το xargs θα δεχτεί είσοδο με σωλήνωση. Μπορεί επίσης να δεχθεί είσοδο από ένα αρχείο. Το xargs χρησιμοποιεί αυτή την είσοδο ως παραμέτρους για τις εντολές με τις οποίες του είπαμε να δουλέψει. Εάν δεν πούμε στο xargs να δουλέψει με μια συγκεκριμένη εντολή, θα χρησιμοποιήσει προεπιλογή echo.

Μπορούμε να το χρησιμοποιήσουμε για να δείξουμε πώς τα xargs θα παράγουν πάντα μια γραμμή εξόδου, ακόμη και από είσοδο πολλαπλών γραμμών.

Αν χρησιμοποιήσουμε την επιλογή -1 (list one file per line) με το ls, παίρνουμε a μία στήλη ονομάτων αρχείων.

ls -1 ./*.sh

Αυτό παραθέτει τα αρχεία σεναρίων φλοιού στον τρέχοντα κατάλογο.

Παίρνουμε μια μονή στήλη όπως αναμενόταν. Αν το διοχετεύσουμε μέσω xargs τι παίρνουμε;

ls -1 ./*.sh | xargs

Η έξοδος γράφεται στο παράθυρο του τερματικού, ως μια μεγάλη ροή κειμένου.

  Γιατί το σύστημα του Linux είναι ακόμα διχαστικό μετά από όλα αυτά τα χρόνια

Αυτή η δυνατότητα είναι που ας τροφοδοτήσουμε το xargs παραμέτρους σε άλλες εντολές.

Χρήση xargs Με wc

Μπορούμε να χρησιμοποιήσουμε το xargs για να μετρήσουμε εύκολα το wc λέξεις, χαρακτήρες και γραμμές σε πολλά αρχεία.

ls *.page | xargs wc

Αυτό συμβαίνει:

Το ls παραθέτει τα αρχεία *.page και μεταβιβάζει τη λίστα στο xargs.
Το xargs μεταβιβάζει τα ονόματα αρχείων στο wc.
Το wc αντιμετωπίζει τα ονόματα αρχείων σαν να τα είχε λάβει ως παραμέτρους της γραμμής εντολών.

Τα στατιστικά στοιχεία για κάθε αρχείο εμφανίζονται μαζί με ένα συνολικό σύνολο.

Χρήση xargs με επιβεβαίωση

Μπορούμε να χρησιμοποιήσουμε την επιλογή -p (διαδραστική) για να μας ζητήσει από το xargs να επιβεβαιώσουμε ότι είμαστε χαρούμενοι που θα προχωρήσει.

Αν περάσουμε μια συμβολοσειρά ονομάτων αρχείων για να αγγίξουμε, μέσω του xargs, το touch θα δημιουργήστε τα αρχεία για εμάς.

echo 'one two three' | xargs -p touch

Εμφανίζεται η εντολή που πρόκειται να εκτελεστεί και το xargs περιμένει να απαντήσουμε πληκτρολογώντας «y» ή «Y» ή «n» ή «N» και πατώντας Enter.

Εάν πατήσετε απλώς Enter, αντιμετωπίζεται ως “n”. Η εντολή εκτελείται μόνο εάν πληκτρολογήσετε “y” ή “Y”.

Πατήσαμε “y” και πατήσαμε Enter. Μπορούμε να χρησιμοποιήσουμε το ls για να ελέγξουμε ότι τα αρχεία έχουν δημιουργηθεί.

ls one two three

Χρήση xargs με πολλαπλές εντολές

Μπορούμε να χρησιμοποιήσουμε πολλαπλές εντολές με xargs χρησιμοποιώντας την επιλογή -I (αρχικά ορίσματα).

Αυτή η επιλογή ορίζει μια συμβολοσειρά αντικατάστασης. Όπου εμφανίζεται το διακριτικό για τη συμβολοσειρά αντικατάστασης στη γραμμή εντολών, εισάγονται οι τιμές που δόθηκαν στο xargs.

Ας χρησιμοποιήσουμε την εντολή δέντρου για να δούμε τους υποκαταλόγους από τον τρέχοντα κατάλογο. Η επιλογή -d (κατάλογος) προκαλεί το δέντρο να αγνοεί τα αρχεία και να αναφέρει μόνο τους καταλόγους.

tree -d

Υπάρχει ένας μόνο υποκατάλογος που ονομάζεται “εικόνες”.

Σε ένα αρχείο που ονομάζεται “directories.txt”, έχουμε τα ονόματα ορισμένων καταλόγων που θέλουμε να έχουμε δημιουργήσει. Μπορούμε να δούμε το περιεχόμενό του χρησιμοποιώντας το cat.

cat directories.txt

Θα το χρησιμοποιήσουμε ως δεδομένα εισόδου για το xargs. Η εντολή που θα κάνουμε είναι η εξής:

cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'

Αυτό αναλύεται ως εξής:

cat directoryies.txt |: Αυτό ωθεί τα περιεχόμενα του αρχείου directrories.txt (όλα τα νέα ονόματα καταλόγου) σε xargs.
xargs -I %: Αυτό ορίζει μια “αντικατάσταση-συμβολοσειρά” με το διακριτικό “%”.
sh -c: Αυτό ξεκινά ένα νέο υποκέλυφος. Το -c (εντολή) λέει στο κέλυφος να διαβάζει εντολές από τη γραμμή εντολών.
‘ηχώ %; mkdir %’: καθένα από τα διακριτικά “%” θα αντικατασταθεί από τα ονόματα καταλόγου που μεταβιβάζονται από το xargs. Η εντολή echo θα εκτυπώσει το όνομα του καταλόγου. η εντολή mkdir θα δημιουργήσει τον κατάλογο.

  Πώς να βρείτε εύκολα αρχεία με TagSpaces στο Linux

Οι κατάλογοι παρατίθενται ένας προς έναν.

Μπορούμε να χρησιμοποιήσουμε ξανά το δέντρο για να επαληθεύσουμε ότι έχουν δημιουργηθεί οι κατάλογοι.

tree -d

Αντιγραφή αρχείων σε πολλαπλές τοποθεσίες

Μπορούμε να χρησιμοποιήσουμε το xargs για να μας επιτρέψει να αντιγράψουμε αρχεία σε πολλές τοποθεσίες με μία μόνο εντολή.

Θα μεταφέρουμε τα ονόματα δύο καταλόγων σε xargs ως παραμέτρους εισόδου. Θα πούμε στο xargs να περάσει μόνο μία από αυτές τις παραμέτρους κάθε φορά στην εντολή με την οποία δουλεύει.

Σε αυτήν την περίπτωση, η εντολή είναι cp. Έτσι, το αποτέλεσμα είναι να καλέσετε το cp δύο φορές, κάθε φορά με έναν από τους δύο καταλόγους ως παράμετρο γραμμής εντολών. Η παράμετρος xargs που επιτρέπει να συμβεί αυτό είναι η επιλογή -n (μέγιστος αριθμός). Θα ορίσουμε αυτό να είναι ένα.

Χρησιμοποιούμε επίσης την επιλογή -v (verbose) με cp ώστε να αναφέρει τι συμβαίνει.

echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page

Τα αρχεία αντιγράφονται στους δύο καταλόγους, έναν κατάλογο κάθε φορά. Το cp αναφέρει κάθε ενέργεια αντιγραφής αρχείου έτσι ώστε να μπορούμε να τη δούμε να λαμβάνει χώρα.

Διαγραφή αρχείων σε ένθετους καταλόγους

Εάν τα ονόματα αρχείων έχουν κενά και περίεργους χαρακτήρες – όπως χαρακτήρες νέας γραμμής – το xargs δεν θα μπορεί να τα ερμηνεύσει σωστά. Μπορούμε να ξεπεράσουμε αυτό το πρόβλημα χρησιμοποιώντας την επιλογή -0 (null Terminator). Αυτό λέει στο xargs να χρησιμοποιήσει τον μηδενικό χαρακτήρα ως τελικό οριοθέτη για τα ονόματα αρχείων.

Θα χρησιμοποιήσουμε το find σε αυτό το παράδειγμα. Η εύρεση έχει τη δική της επιλογή που ασχολείται με το κενό διάστημα και περίεργους χαρακτήρες στα ονόματα αρχείων. Είναι η επιλογή -print0 (πλήρες όνομα, μηδενικός χαρακτήρας).

find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"

Αυτό αναλύεται ως εξής:

εύρημα . -name “*.png”: το find θα πραγματοποιήσει αναζήτηση από τον τρέχοντα κατάλογο “.” για αντικείμενα με ονόματα που ταιριάζουν με το «*.png» που είναι αρχεία (τύπος -f).
-print0: τα ονόματα θα τερματιστούν με έναν μηδενικό χαρακτήρα και θα ληφθούν υπόψη τα κενά και οι περίεργοι χαρακτήρες.
xargs -0: Το xargs θα θεωρήσει επίσης ότι τα ονόματα αρχείων είναι μηδενικά και τα κενά και οι περίεργοι χαρακτήρες δεν θα δημιουργήσουν προβλήματα.
rm -v -rf “{}”: το rm πρόκειται να είναι αναλυτικό και να αναφέρει τι συμβαίνει (-v). Θα είναι αναδρομικό (-r) και θα κοιτάζει μέσα από ένθετους υποκαταλόγους και θα αφαιρεί αρχεία χωρίς να ζητά (-f). Το “{}” αντικαθίσταται από κάθε όνομα αρχείου.

  Πώς να παίξετε παιχνίδια Nintendo 64 σε Linux

εύρημα .  -όνομα

Γίνεται αναζήτηση όλων των υποκαταλόγων και τα αρχεία που ταιριάζουν με το μοτίβο αναζήτησης διαγράφονται.

Κατάργηση ένθετων καταλόγων

Ας υποθέσουμε ότι θέλουμε να αφαιρέσουμε ένα σύνολο ένθετων υποκαταλόγων. δέντρο θα μας αφήσει να τα δούμε.

tree -d

find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"

Αυτή η εντολή θα χρησιμοποιήσει το find για αναδρομική αναζήτηση στον τρέχοντα κατάλογο. Ο στόχος αναζήτησης είναι ένας κατάλογος που ονομάζεται “level_one”. Τα ονόματα των καταλόγων περνούν μέσω xargs στο rm.

εύρημα .  -όνομα

Οι μόνες σημαντικές αλλαγές μεταξύ αυτής της εντολής και της προηγούμενης εντολής είναι ότι ο όρος αναζήτησης είναι το όνομα του κορυφαίου καταλόγου και ο -type d λέει στο find να αναζητήσει καταλόγους και όχι αρχεία.

Το όνομα κάθε καταλόγου εκτυπώνεται καθώς αφαιρείται. Μπορούμε να ελέγξουμε με το δέντρο:

tree -d

Όλοι οι ένθετοι υποκατάλογοι διαγράφονται.

Διαγραφή όλων των αρχείων, εκτός από έναν τύπο αρχείου

Μπορούμε να χρησιμοποιήσουμε find, xargs και rm για να διαγράψουμε όλα τα αρχεία εκτός από έναν τύπο που θέλουμε να διατηρήσουμε. Είναι ελαφρώς αντιφατικό, αλλά παρέχουμε το όνομα του τύπου αρχείου που θέλουμε να διατηρήσουμε, όχι το όνομα αυτών που θέλουμε να διαγράψουμε.

Η επιλογή -not λέει στο find να επιστρέψει τα ονόματα των αρχείων που δεν ταιριάζουν με το μοτίβο αναζήτησης. Χρησιμοποιούμε την επιλογή -I (αρχικά ορίσματα) με το xargs για άλλη μια φορά. Αυτή τη φορά το διακριτικό αντικατάστασης συμβολοσειράς που ορίζουμε είναι “{}”. Αυτό θα συμπεριφέρεται ακριβώς όπως το διακριτικό αντικατάστασης συμβολοσειράς που δημιουργήσαμε προηγουμένως, το οποίο έτυχε να είναι “%”.

find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}

εύρημα .  -πληκτρολογήστε f -όχι - όνομα

Μπορούμε να ελέγξουμε με ls. Τα μόνα αρχεία που έχουν απομείνει στον κατάλογο είναι αυτά που ταιριάζουν με το μοτίβο αναζήτησης “*.sh”.

ls -l

Δημιουργία αρχείου αρχείου με το Xargs

Μπορούμε να χρησιμοποιήσουμε το find για να αναζητήσουμε αρχεία και να τα περάσουμε από το xargs στο tar, για να δημιουργήσουμε ένα αρχείο αρχειοθέτησης.

Θα κάνουμε αναζήτηση στον τρέχοντα κατάλογο. Το μοτίβο αναζήτησης είναι “*.page”, επομένως θα αναζητήσουμε αρχεία “.page”.

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

βρείτε ./ - όνομα

Τα αρχεία παρατίθενται όπως αναμένεται, καθώς δημιουργείται το αρχείο αρχειοθέτησης.

Ο Διαμεσολαβητής Δεδομένων

Μερικές φορές χρειάζεστε λίγη σκαλωσιά όταν στοιβάζετε τα πράγματα μαζί. Το xargs γεφυρώνει το χάσμα μεταξύ εντολών που μπορούν να αντλήσουν πληροφορίες και εντολών που δεν έχουν δημιουργηθεί για να τις λάβουν.

Τόσο το xargs όσο και το find έχουν έναν τεράστιο αριθμό επιλογών. Σας ενθαρρύνουμε να ανατρέξετε στις σελίδες man τους για να μάθετε περισσότερα.