Bạn có thể sử dụng -exec
và {}
tính năng của lệnh find
do đó bạn không cần bất kỳ ống tại tất cả: ''
find -maxdepth 1 -type d -name "*.y" -mtime +`expr 2 \* 365` -exec mv "{}" "{}.old" \;
Ngoài ra bạn không cần phải xác định đường dẫn - điều này là mặc định cho find
. Và bạn đã sử dụng dấu gạch chéo thêm trong "*.y"
. Tất nhiên nếu tên tập tin của bạn không thực sự chứa dấu ngoặc kép.
Trong sự công bằng cần lưu ý, phiên bản đó với vòng lặp while read
là nhanh nhất được đề xuất tại đây. Dưới đây là một số đo Ví dụ:
$ cat measure
#!/bin/sh
case $2 in
1) find "$1" -print0 | xargs -0 -I file echo mv file file.old ;;
2) find "$1" -exec echo mv '{}' '{}.old' \; ;;
3) find "$1" | while read file; do
echo mv "$file" "$file.old"
done;;
esac
$ time ./measure android-ndk-r5c 1 | wc
6225 18675 955493
real 0m6.585s
user 0m18.933s
sys 0m4.476s
$ time ./measure android-ndk-r5c 2 | wc
6225 18675 955493
real 0m6.877s
user 0m18.517s
sys 0m4.788s
$ time ./measure android-ndk-r5c 3 | wc
6225 18675 955493
real 0m0.262s
user 0m0.088s
sys 0m0.236s
Tôi nghĩ rằng đó là vì find
và xargs
gọi thêm/bin/sh (trên thực tế exec(3)
hiện nó) mỗi khi cho thực thi một lệnh, trong khi vỏ while
vòng lặp thì không.
UPD: Nếu phiên bản busybox của bạn đã được biên soạn mà không -exec
tùy chọn hỗ trợ cho các find
lệnh thì while
vòng lặp hoặc xargs
, đề xuất trong các câu trả lời khác (one, two), là con đường của bạn.
Nguồn
2012-01-06 14:40:37
\ "about? Điều đó sẽ cho biết tìm các tệp danh sách được gọi chính xác' "* .y" '(dấu ngoặc kép sẽ được chuyển để tìm và trong khi dấu * sẽ được mở rộng bằng trình bao, nó sẽ không tìm thấy gì và thông qua thông qua anyway), mà tôi nghi ngờ tồn tại. –
Trong số các tùy chọn biên dịch khác nhau cho busybox là 'CONFIG_FEATURE_FIND_PRINT0',' CONFIG_FEATURE_FIND_EXEC', 'CONFIG_FEATURE_FIND_EXEC_PLUS' - cách tiếp cận sẽ hoặc sẽ không hoạt động tùy thuộc vào chi tiết chính xác cách * bản sao của bạn được biên dịch. –