Εκτελέστε πολλαπλές λειτουργίες στο Linux με την εντολή 'xargs'
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
, μπορεί επίσης να χρησιμοποιηθεί με πολλές άλλες εντολές. Πηγαίνετε από την κύρια σελίδα της εντολής για να μάθετε περισσότερα σχετικά με αυτό και αφήστε ένα σχόλιο παρακάτω αν έχετε αμφιβολία / ερώτημα.