Đối với một số người dùng nhiều kinh nghiệm hơn, chúng tôi luôn tìm cách tìm ra những cách mới để làm việc thông minh hơn và không vất vả hơn ở thiết bị đầu cuối. xargs
là một lệnh hữu ích hoạt động như một cầu nối giữa hai lệnh, đọc kết quả đầu ra của một lệnh và thực thi lệnh kia với các mục được đọc. Lệnh này thường được sử dụng nhất trong các tình huống khi người dùng đang tìm kiếm một mẫu, xóa và đổi tên tệp, v.v. Sau đây, chúng tôi hướng dẫn bạn cách sử dụng xargs
lệnh có lợi cho bạn.
xargs là gì?
Ở dạng cơ bản, xargs
đọc thông tin từ đầu vào chuẩn (hoặc STDIN) và thực hiện lệnh một hoặc nhiều lần với các mục đã đọc. Có rất nhiều minh chứng đơn giản, nhưng đây là minh chứng cho thấy ý tôi muốn nói.
Để có xargs
thực thi ls
trên thư mục Documents của tôi, tôi sẽ chạy lệnh sau:
echo "Documents" | xargs ls
Ký tự ống dẫn |
đang đặt bất kỳ thứ gì có trước đó dưới dạng STDIN cho xargs
.
Bạn có thể thấy rằng xargs
đọc thư mục Tài liệu của tôi mà không có vấn đề gì. Đây chỉ là một ví dụ về khả năng của xargs
lệnh.
Trong khi xargs
lệnh có thể được sử dụng trong các hoạt động dòng lệnh khác nhau, nó thực sự tiện dụng khi được sử dụng với find
yêu cầu. Trong bài viết này, chúng tôi thảo luận về một số ví dụ hữu ích để hiểu cách xargs
và find
có thể được sử dụng cùng nhau.
Hoạt động liên quan đến nhiều tệp
Giả sử bạn muốn sao chép nội dung của “ref.txt” vào tất cả các tệp văn bản có trong một thư mục. Mặc dù nhiệm vụ có thể yêu cầu bạn thực hiện nhiều lệnh, nhưng xargs
cùng với find
lệnh, làm cho nó đơn giản. Tôi có một vài thư mục thử nghiệm. Một có “test0.txt”, chứa văn bản và thư mục còn lại có 10 tệp thử nghiệm khác không có văn bản trong đó. Nếu tôi muốn lấy nội dung của test0.txt
và sao chép nó vào phần còn lại của các tệp văn bản trong các thư mục khác, tôi sẽ chạy lệnh sau:
find ./test-dir1/ -name "*.txt" | xargs -n1 cp test0.txt
Để hiểu lệnh hiển thị ở trên, hãy chia nó thành hai phần.
Phần đầu tiên là find ./test-dir1/ -name "*.txt"
, tìm kiếm tất cả các tệp .txt có trong thư mục “test-dir1”. Bạn có thể chỉ định bất kỳ thư mục nào ở đây.
Phần thứ hai, xargs -n1 cp test.txt
, sẽ lấy đầu ra của lệnh đầu tiên (tên tệp kết quả) và chuyển nó cho cp
(sao chép) từng lệnh một. Lưu ý rằng -n
ở đây tùy chọn rất quan trọng, vì nó hướng dẫn xargs
để sử dụng một đối số cho mỗi lần thực thi.
Khi được kết hợp với nhau, lệnh đầy đủ sẽ sao chép nội dung của “test0.txt” vào tất cả các tệp .txt trong thư mục.
Hoạt động liên quan đến số lượng lớn các tranh luận
Một trong những lợi ích chính của việc sử dụng xargs
là khả năng xử lý một số lượng lớn các đối số. Ví dụ:trong khi xóa một số lượng lớn tệp trong một lần, rm
đôi khi lệnh sẽ không thành công với “ Danh sách đối số quá dài " lỗi. Đó là bởi vì nó không thể đơn giản xử lý một danh sách dài các đối số như vậy. Trường hợp này thường xảy ra khi bạn có quá nhiều tệp trong thư mục mà bạn muốn xóa.
Giả sử bạn có 75 tệp PDF và gặp lỗi khi xóa chúng.
Điều này có thể được khắc phục dễ dàng với xargs
. Để xóa tất cả các tệp này, hãy sử dụng lệnh sau:
find ./test-dir2/ -type f -name "*.pdf" -print | xargs rm -f
Hoạt động liên quan đến tìm kiếm mẫu
Các nhà phát triển phần mềm cũng như quản trị viên hệ thống thực hiện rất nhiều tìm kiếm theo mẫu trong khi làm việc trên dòng lệnh. Ví dụ:một nhà phát triển có thể muốn xem nhanh các tệp dự án sửa đổi một biến cụ thể hoặc quản trị viên hệ thống có thể muốn xem các tệp sử dụng một tham số cấu hình hệ thống cụ thể. Trong các trường hợp này, xargs
, cùng với find
và grep
, giúp mọi thứ trở nên dễ dàng với bạn.
Ví dụ:để tìm kiếm tất cả các tệp “.txt” có chứa chuỗi “maketecheasier”, hãy chạy lệnh sau:
find ./ -name "*.txt" | xargs grep "maketecheasier"
Đây là kết quả đầu ra của lệnh được tạo trên hệ thống của tôi.
Thao tác Cắt / Sao chép
Xargs
, cùng với find
, cũng có thể được sử dụng để sao chép hoặc di chuyển một tập hợp các tệp từ thư mục này sang thư mục khác. Ví dụ:để di chuyển tất cả các tệp văn bản hơn 10 phút từ thư mục hiện tại sang thư mục trước đó, hãy sử dụng lệnh sau:
find . -name "*.txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../
-I
tùy chọn dòng lệnh được sử dụng bởi xargs
lệnh để xác định một chuỗi thay thế được thay thế bằng các tên được đọc từ đầu ra của find
yêu cầu. Ở đây chuỗi thay thế là {}
, nhưng nó có thể là bất cứ điều gì. Ví dụ:bạn có thể sử dụng “tệp” làm chuỗi thay thế.
find . -name "*.txt" -mmin 10 | xargs -n1 -I 'file' mv 'file' ./practice
Cách cho xargs biết khi nào nên thoát khỏi
Giả sử bạn muốn liệt kê chi tiết của tất cả các tệp .txt có trong thư mục hiện tại. Như đã giải thích, bạn có thể dễ dàng thực hiện bằng lệnh sau:
find . -name "*.txt" | xargs ls -l
Nhưng có một vấn đề:xargs
lệnh sẽ thực thi ls
ngay cả khi find
lệnh không tìm thấy bất kỳ tệp .txt nào. Sau đây là một ví dụ.
Vì vậy, bạn có thể thấy rằng không có tệp .txt nào trong thư mục, nhưng điều đó không ngăn được xargs
khỏi việc thực thi ls
yêu cầu. Để thay đổi hành vi này, hãy sử dụng -r
tùy chọn dòng lệnh:
find . -name "*.txt" | xargs -r ls -l
Kết luận
Mặc dù ở đây tôi tập trung vào việc sử dụng xargs
với find
, nó cũng có thể được sử dụng với nhiều lệnh khác. Nếu bạn có nhiều lệnh phức tạp cần thực hiện, hãy xargs
là một công cụ rất hữu ích.
Nếu bạn thích bài viết của chúng tôi về cách sử dụng xargs
trong Linux, hãy nhớ xem một số nội dung Linux khác của chúng tôi, chẳng hạn như hướng dẫn của chúng tôi về cách khắc phục lỗi “không còn dung lượng trên thiết bị” hoặc tăng tốc Ubuntu.