Đối với user có kinh nghiệm, luôn tìm cách làm việc thông minh hơn chứ không phải chăm chỉ hơn tại terminal. xargs là lệnh hữu ích đóng vai cầu nối giữa hai lệnh, đọc output của lệnh này và execute lệnh kia với item đọc được. Lệnh thường dùng khi search pattern, remove/rename file, và hơn thế nữa. Bài viết hướng dẫn dùng lệnh xargs tận dụng lợi thế.
xargs là gì?
Dạng cơ bản, xargs đọc thông tin từ standard input (STDIN) và execute một lệnh một hoặc nhiều lần với item đọc được. Có nhiều demo đơn giản, đây là một ví dụ cho thấy ý nghĩa.
Để xargs execute lệnh ls trên thư mục Documents, chạy:
echo "Documents" | xargs ls
Ký tự pipe | piping bất cứ gì trước đó làm STDIN cho xargs.
Thấy xargs đọc Documents folder không vấn đề. Chỉ là một ví dụ khả năng xargs.
Mặc dù xargs dùng được trong nhiều operation command line, nó real handy khi dùng với lệnh find. Bài viết thảo luận ví dụ hữu ích hiểu cách xargs và find dùng chung.
Operation liên quan nhiều file
Giả sử bạn muốn copy nội dung "ref.txt" vào tất cả text file trong thư mục. Task khác sẽ yêu cầu multiple command, nhưng xargs kết hợp find làm đơn giản. Tác giả có test directories. Một có "test0.txt" chứa text, directory kia có 10 test file khác rỗng. Muốn copy content test0.txt vào các text file còn lại, chạy:
find ./test-dir1/ -name "*.txt" | xargs -n1 cp test0.txt
Hiểu lệnh: chia 2 phần.
Phần 1: find ./test-dir1/ -name "*.txt", tìm tất cả file .txt trong "test-dir1". Chỉ định thư mục bất kỳ.
Phần 2: xargs -n1 cp test.txt, lấy output lệnh 1 (tên file kết quả) pass cho cp (copy) one by one. Option -n quan trọng: chỉ dẫn xargs dùng một argument mỗi execution.
Kết hợp, lệnh full copy content "test0.txt" vào tất cả .txt trong directory.
Operation liên quan số lượng argument lớn
Lợi thế lớn xargs: xử lý số lượng argument lớn. Ví dụ: xóa nhiều file một lúc, rm đôi khi fail lỗi "Argument list too long". Vì không handle được list argument quá dài. Thường xảy ra khi quá nhiều file trong folder muốn xóa.
Giả sử 75 PDF và bị lỗi xóa.
Dễ dàng fix với xargs. Xóa tất cả file:
find ./test-dir2/ -type f -name "*.pdf" -print | xargs rm -f
Operation liên quan pattern search
Developer và sysadmin làm nhiều pattern searching trên command line. Ví dụ: dev muốn xem nhanh project file modify biến cụ thể, sysadmin muốn xem file dùng system config parameter đặc biệt. Trong scenario này, xargs kết hợp find và grep làm dễ dàng.
Ví dụ: tìm tất cả file ".txt" chứa chuỗi "maketecheasier", chạy:
find ./ -name "*.txt" | xargs grep "maketecheasier"
Output lệnh trên hệ thống tác giả.
Operation Cut/Copy
xargs kết hợp find cũng copy/move set file từ directory này sang directory khác. Ví dụ: move tất cả text file cũ hơn 10 phút từ current directory sang previous directory:
find . -name "*.txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../
Option -I của xargs định nghĩa replace-string bị replace bởi tên đọc từ output find. Ở đây replace-string là {}, nhưng có thể bất cứ gì. Ví dụ dùng "file" làm replace-string:
find . -name "*.txt" -mmin 10 | xargs -n1 -I 'file' mv 'file' ./practice
Cách báo cho xargs khi nào dừng
Giả sử muốn list chi tiết tất cả file .txt trong current directory. Như đã giải thích, dễ dàng bằng:
find . -name "*.txt" | xargs ls -l
Vấn đề: xargs execute ls ngay cả khi find không tìm thấy file .txt nào. Ví dụ:
Thấy không có file .txt trong directory, nhưng không ngăn xargs chạy ls. Để thay đổi behavior, dùng option -r:
find . -name "*.txt" | xargs -r ls -l
Kết luận
Mặc dù tập trung dùng xargs với find, nó cũng dùng với nhiều lệnh khác. Nếu có multiple, complex command cần execute, xargs là tool rất hữu ích.
Nếu thích bài viết dùng xargs trong Linux, xem thêm content Linux khác: fix lỗi "no space left on device" hoặc tăng tốc Ubuntu.