-exec sang xargs chuyển đổi trong lệnh tìm

Aug 24 2020

Tôi đang sử dụng lệnh dưới đây trong tập lệnh của mình để thực hiện dos2unixthao tác trên các tệp mà tôi sao chép từ Windows sang Linux. Có rất nhiều tệp, vì vậy cần một lượng thời gian đáng kể để thực hiện thao tác này.

Tôi đã tìm kiếm trên internet để tối ưu hóa kết quả này và nhận thấy rằng chúng tôi có thể sử dụng xargsvới findthay vì -execđể tăng hiệu suất, nhưng tôi đang đấu tranh để chuyển đổi từ bên dưới sang sử dụng với xargs:

find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;

Trả lời

1 waltinator Aug 24 2020 at 00:35

Tạo một tập lệnh ~/binđể xử lý danh sách các tệp, gọi nó doit, chứa

#!/bin/bash
while [[ $# -ne 0 ]] ; do thisfile="$1"
    shift
    dos2unix -k -n "$thisfile" tmp_file mv tmp_file "$thisfile"
done

Sau đó,

chmod +x ~/bin/doit

Và cuối cùng,

find /path/to/files -type f -print0 | \
    xargs -0 -r $HOME/bin/doit

Đọc man find xargs bash.

8 Quasímodo Aug 24 2020 at 01:07

Nó thực sự đơn giản hơn nhiều. Bạn không cần gọi shell cũng như sử dụng mvvì dos2unixđã sửa đổi tệp đích nếu bạn không -ngắn cờ cho nó .

find /path_to_files -type f -exec dos2unix -k -q -- {} +

-type fđể chỉ tìm kiếm các tệp thông thường, không phải thư mục. -qcờ được cấp để dos2unixnó không viết các thông báo thông tin vào stdout. Và chúng tôi sử dụng {} +thay vì {} \;như vậy find không gọi một dos2unixquy trình cho mỗi tệp được tìm thấy, thay vào đó, nó cung cấp nhiều tệp nhất có thể dưới dạng đối số ( dos2unix file1 file2 file3 ...).

Xargs sẽ chỉ là một quá trình phụ và do đó một quả phạt đền trong hiệp phụ. Tránh gọi các quy trình mới bất cứ khi nào bạn có thể.