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

Στη βασική του μορφή, το xargs διαβάζει πληροφορίες από την τυπική είσοδο (ή το STDIN) και εκτελεί μια εντολή μία ή περισσότερες φορές με τα στοιχεία που διαβάζονται.

Για παράδειγμα, η ακόλουθη εντολή xargs αναμένει από τον χρήστη να εισάγει ένα όνομα αρχείου ή καταλόγου:

 xargs ls -l 

Μόλις εισαχθεί ένα όνομα, η εντολή xargs διαβιβάζει αυτές τις πληροφορίες στην εντολή ls .

Εδώ είναι η έξοδος της παραπάνω εντολής xargs όταν την εκτέλεσα από τον αρχικό μου κατάλογο εισάγοντας ως είσοδο τα "Documents" (που είναι ένας υπο-κατάλογος στον αρχικό μου φάκελο):

Παρατηρήστε ότι σε αυτή την περίπτωση, η εντολή xargs εκτέλεσε την εντολή ls με το όνομα καταλόγου ως όρισμα γραμμής εντολών για να παράγει μια λίστα αρχείων που υπάρχουν στον κατάλογο.

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

Λειτουργίες που περιλαμβάνουν πολλαπλά αρχεία

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

Απλά εκτελέστε την ακόλουθη εντολή:

 βρείτε ./ -name "* .txt" | xargs -n1 cp ../ref.txt 

Για να κατανοήσουμε την εντολή που φαίνεται παραπάνω, ας το χωρίσουμε σε δύο μέρη.

Το πρώτο μέρος είναι find ./ -name "*.txt", το οποίο αναζητά όλα τα αρχεία .txt που υπάρχουν στον τρέχοντα κατάλογο.

Το δεύτερο μέρος xargs -n1 cp ../ref.txt θα τραβήξει την έξοδο της πρώτης εντολής (τα ονόματα των αρχείων που προκύπτουν) και θα την μεταβιβάσει στην εντολή cp (copy) μία προς μία. Σημειώστε ότι η επιλογή -n είναι κρίσιμη εδώ, καθώς δίνει εντολή στο xargs να χρησιμοποιεί ένα όρισμα ανά εκτέλεση.

Όταν συνδυαστούν, η πλήρης εντολή θα αντιγράψει το περιεχόμενο του "ref.txt" σε όλα τα αρχεία .txt του καταλόγου.

Πράξεις που περιλαμβάνουν μεγάλο αριθμό επιχειρημάτων

Ένα από τα σημαντικότερα πλεονεκτήματα της χρήσης xargs είναι η ικανότητά του να χειρίζεται μεγάλο αριθμό επιχειρημάτων. Για παράδειγμα, κατά τη διαγραφή ενός μεγάλου αριθμού αρχείων με μία κίνηση, η εντολή rm θα αποτύγχανε μερικές φορές με ένα σφάλμα " Λίστα παραμέτρων Argument too long ". Αυτό συμβαίνει επειδή δεν μπορούσε απλά να χειριστεί μια τόσο μεγάλη λίστα επιχειρημάτων. Αυτό συμβαίνει συνήθως όταν έχετε πάρα πολλά αρχεία στο φάκελο που θέλετε να διαγράψετε.

Αυτό μπορεί εύκολα να καθοριστεί με xargs . Για να διαγράψετε όλα αυτά τα αρχεία, χρησιμοποιήστε την ακόλουθη εντολή:

 βρείτε ./rm-test/ -name "*" -print | xargs rm 

Λειτουργίες που περιλαμβάνουν αναζήτηση προτύπων

Οι προγραμματιστές λογισμικού καθώς και οι διαχειριστές συστημάτων κάνουν πολλή αναζήτηση προτύπων ενώ εργάζονται στη γραμμή εντολών. Για παράδειγμα, ένας προγραμματιστής μπορεί να θέλει να εξετάσει γρήγορα τα αρχεία του έργου που τροποποιούν μια συγκεκριμένη μεταβλητή ή ένας διαχειριστής συστήματος μπορεί να θέλει να δει τα αρχεία που χρησιμοποιούν μια συγκεκριμένη παράμετρο διαμόρφωσης του συστήματος. Σε αυτά τα σενάρια, το xargs, μαζί με το find and grep, κάνει τα πράγματα εύκολο για σας.

Για παράδειγμα, για να αναζητήσετε όλα τα αρχεία .txt που περιέχουν τη συμβολοσειρά "maketecheasier", εκτελέστε την ακόλουθη εντολή:

 $ βρείτε ./ -name "* .txt" | xargs grep "maketecheasier" 

Εδώ είναι η έξοδος της εντολής που παράγεται στο σύστημά μου:

Λειτουργίες κοπής / αντιγραφής

Xargs μαζί με την εντολή find μπορούν επίσης να χρησιμοποιηθούν για την αντιγραφή ή την μετακίνηση ενός συνόλου αρχείων από έναν κατάλογο στον άλλο. Για παράδειγμα, για να μετακινήσετε όλα τα αρχεία κειμένου που είναι παλαιότερα από 10 λεπτά από τον τρέχοντα κατάλογο στον προηγούμενο κατάλογο, χρησιμοποιήστε την ακόλουθη εντολή:

 εύρημα . -name "* .txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../ 

Η επιλογή γραμμής εντολών -I χρησιμοποιείται από την εντολή xargs για να ορίσετε μια συμβολοσειρά αντικατάστασης που αντικαθίσταται με ονόματα που διαβάζονται από την έξοδο της εντολής find . Εδώ η αντικατάσταση-string είναι {}, αλλά θα μπορούσε να είναι οτιδήποτε. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το "αρχείο" ως συμβολοσειρά αντικατάστασης.

 εύρημα . -name "* .txt" -mmin 10 | xargs -n1 -I 'αρχείο' mv 'αρχείο'. / πρακτική 

Πώς να πείτε στο xargs πότε πρέπει να σταματήσετε

Ας υποθέσουμε ότι θέλετε να ορίσετε τις λεπτομέρειες όλων των αρχείων .txt που υπάρχουν στον τρέχοντα κατάλογο. Όπως ήδη εξηγείται, μπορεί εύκολα να γίνει χρησιμοποιώντας την ακόλουθη εντολή:

 εύρημα . -name "* .txt" | xargs ls -l 

Υπάρχει όμως ένα πρόβλημα. η εντολή xargs θα εκτελέσει την εντολή ls ακόμα κι αν η εντολή find δεν βρει κανένα αρχείο .txt. Ακολουθεί ένα παράδειγμα:

Έτσι μπορείτε να δείτε ότι δεν υπάρχουν. txt αρχεία στον κατάλογο, αλλά αυτό δεν σταμάτησε xargs από την εκτέλεση της εντολής ls . Για να αλλάξετε αυτήν τη συμπεριφορά, χρησιμοποιήστε την επιλογή γραμμής εντολών -r :

 εύρημα . -name "* .txt" | xargs -r ls -l 

συμπέρασμα

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