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 đầu ra của một lệnh và thực thi lệnh kia với các mục đã đọc. Lệnh này được sử dụng phổ biến nhất trong các tình huống khi người dùng tìm kiếm mẫu, xóa và đổi tên tệp và hơn thế nữa.

Trong dạng cơ bản của nó, xargs đọc thông tin từ đầu vào tiêu chuẩn (hoặc STDIN) và thực thi lệnh một hoặc nhiều lần với các mục đã đọc.

Như một minh hoạ, lệnh xargs sau đây hy vọng người dùng nhập một tệp hoặc một tên thư mục:

 xargs ls -l 

Khi tên được nhập, lệnh xargs chuyển thông tin đó tới ls .

Đây là đầu ra của lệnh xargs được hiển thị ở trên khi tôi thực thi nó từ thư mục chính của mình bằng cách nhập "Documents" (là thư mục con trong thư mục Home của tôi) làm đầu vào:

Quan sát rằng trong trường hợp này, lệnh xargs thi hành ls với tên thư mục làm đối số dòng lệnh để tạo ra một danh sách các tệp có trong thư mục đó.

Trong khi lệnh xargs có thể được sử dụng trong các hoạt động dòng lệnh khác nhau, nó thực sự có ích khi được sử dụng với lệnh find . Trong bài viết này, chúng ta sẽ thảo luận một số ví dụ hữu ích để hiểu cách xargsfind 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 .txt trong thư mục. Trong khi nhiệm vụ có thể yêu cầu bạn phải thực hiện nhiều lệnh, lệnh xargs, cùng với lệnh find, làm cho nó đơn giản.

Chỉ cần chạy lệnh sau:

 tìm ./ -name "* .txt" | xargs -n1 cp ../ref.txt 

Để hiểu lệnh được hiển thị ở trên, hãy chia nó thành hai phần.

Phần đầu tiên là find ./ -name "*.txt", tìm kiếm tất cả các tệp .txt có trong thư mục hiện tại.

Phần thứ hai xargs -n1 cp ../ref.txt sẽ lấy đầu ra của lệnh đầu tiên (tên tập tin kết quả) và giao nó cho lệnh cp (copy) từng cái một. Lưu ý rằng tùy chọn -n là rất quan trọng ở đây, vì nó chỉ thị xargs sử dụng một đối số cho mỗi lần thực thi.

Khi kết hợp với nhau, lệnh đầy đủ sẽ sao chép nội dung của "ref.txt" vào tất cả các tệp .txt trong thư mục.

Các hoạt động liên quan đến số lượng lớn đối số

Một trong những ưu điểm 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ụ: khi xóa một số lượng lớn tệp trong một lần, lệnh rm đôi khi sẽ không thành công với lỗi " Danh sách đối số quá dài ". Đó là bởi vì nó không thể chỉ đơn giản là xử lý một danh sách dài các đối số. Điều 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.

Điều này có thể dễ dàng sửa với xargs . Để xóa tất cả các tệp này, hãy sử dụng lệnh sau:

 tìm ./rm-test/ -name "*" -print | xargs rm 

Các 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ư các quản trị viên hệ thống thực hiện rất nhiều mẫu tìm kiếm 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 tham số cấu hình hệ thống cụ thể. Trong những tình huống này, xargs, cùng với findgrep, giúp bạn dễ dàng hơn.

Ví dụ: để tìm kiếm tất cả các tệp .txt chứa chuỗi "maketecheasier", hãy chạy lệnh sau:

 $ find ./ -name "* .txt" | xargs grep "maketecheasier" 

Đây là đầu ra 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 lệnh 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ừ mộ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 có thời lượng hơn 10 phút từ thư mục hiện tại sang thư mục trước, sử dụng lệnh sau:

 tìm thấy . tên "* .txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../ 

Tùy chọn dòng lệnh -I lệnh xargs sử dụng để xác định chuỗi thay thế được thay thế bằng tên được đọc từ đầu ra của lệnh find . Ở đây chuỗi thay thế là {}, nhưng nó có thể là bất cứ thứ gì. Ví dụ: bạn có thể sử dụng "tệp" làm chuỗi thay thế.

 tìm thấy . tên "* .txt" -mmin 10 | xargs -n1 -I 'tệp' mv 'tệp' ./practice 

Làm thế nào để nói xargs khi bỏ thuốc lá

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, nó có thể dễ dàng thực hiện bằng cách sử dụng lệnh sau đây:

 tìm thấy . -name "* .txt" | xargs ls -l 

Nhưng có một vấn đề; lệnh xargs sẽ thực hiện ls ngay cả khi lệnh find không tìm thấy bất kỳ tệp .txt nào. Đây là một ví dụ:

Vì vậy, bạn có thể thấy rằng không có. tệp txt trong thư mục, nhưng điều đó không ngăn các xargs thực hiện ls . Để thay đổi hành vi này, sử dụng tùy chọn dòng lệnh -r :

 tìm thấy . -name "* .txt" | xargs -r ls -l 

Phần kết luận

Mặc dù tôi đã tập trung ở đây 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. Đi qua trang chính của lệnh để tìm hiểu thêm về nó, và để lại một bình luận dưới đây nếu bạn có một nghi ngờ / truy vấn.