Điều này có thể được thực hiện từ find
việc sử dụng trực tiếp -exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
Những gì được chuyển đến -exec
sẽ được gọi một lần cho mỗi tệp được tìm thấy với các tham số mẫu {}
được thay thế bằng tên tệp hiện tại. Việc \;
kết thúc lệnh find chỉ chấm dứt dòng.
Việc sử dụng xargs
không thực sự cần thiết trong trường hợp này bởi vì chúng ta cần phải gọi xmllint
một lần cho mỗi tệp vì cả tên tệp đầu vào và đầu ra phải được chỉ định trong cùng một lệnh gọi.
xargs
sẽ là cần thiết nếu lệnh được chuyển đến từ find đang hoạt động trên nhiều tệp cùng một lúc và danh sách đó dài. Bạn không thể làm điều đó trong trường hợp này, vì bạn cần chuyển tên tệp duy nhất cho --output
tùy chọn xmllint
. Nếu không, xargs
bạn có thể gặp phải lỗi "Danh sách đối số quá dài" nếu bạn đang xử lý nhiều tệp. xargs
cũng hỗ trợ chuỗi thay thế tập tin với -I
tùy chọn:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Sẽ làm tương tự như find -exec
lệnh trên. Nếu bất kỳ thư mục nào của bạn có ký tự lẻ trong không gian như bạn sẽ cần sử dụng các -0
tùy chọn find
và xargs
. Nhưng sử dụng xargs
với -I
ngụ ý tùy chọn -L 1
có nghĩa là chỉ xử lý 1 tệp tại một thời điểm, do đó bạn cũng có thể sử dụng trực tiếp find
với -exec
.