Hãy xem câu trả lời của Stephane để biết phương pháp tốt nhất, hãy xem câu trả lời của tôi để biết lý do không sử dụng các giải pháp rõ ràng hơn (và lý do tại sao chúng không hiệu quả nhất).
Bạn có thể sử dụng -Itùy chọn xargs:
find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/
Mà hoạt động trong một cơ chế tương tự findvà {}. Tôi cũng sẽ trích dẫn -nameđối số của bạn (vì một tệp bắt đầu xtrong thư mục hiện tại sẽ bị lấp đầy tệp và được chuyển qua làm đối số cần tìm - sẽ không đưa ra hành vi mong đợi!).
Tuy nhiên, như được chỉ ra bởi manatwork, như chi tiết trong xargstrang man:
-I replace-str
Replace occurrences of replace-str in the initial-arguments with
names read from standard input. Also, unquoted blanks do not
terminate input items; instead the separator is the newline
character. Implies -x and -L 1.
Điều quan trọng cần lưu ý là điều đó -L 1có nghĩa là chỉ một dòng đầu ra từ findsẽ được xử lý tại một thời điểm. Điều này có nghĩa là về mặt cú pháp giống như:
find /tmp/ -ctime -1 -name "x*" -exec mv '{}' ~/play/
(thực thi một mvthao tác duy nhất cho mỗi tệp).
Ngay cả khi sử dụng -0đối số GNU xargs và find -print0đối số gây ra chính xác cùng một hành vi của -I- đây là clone()một quy trình cho mỗi tệp mv:
find . -name "x*" -print0 | strace xargs -0 -I '{}' mv '{}' /tmp/other
.
.
read(0, "./foobar1/xorgslsala11\0./foobar1"..., 4096) = 870
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbb82fad000
open("/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26066, ...}) = 0
mmap(NULL, 26066, PROT_READ, MAP_SHARED, 3, 0) = 0x7fbb82fa6000
close(3) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbb835af9d0) = 661
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 661
--- SIGCHLD (Child exited) @ 0 (0) ---
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbb835af9d0) = 662
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 662
--- SIGCHLD (Child exited) @ 0 (0) ---
.
.
.
-I:find . | xargs -I'{}' mv '{}' ~/play/, nhưng như người đàn ông nói, đó là Implies-xvà-L 1. Vì vậy, không có lợi. Tốt hơn là giữ cho nó đơn giản và sử dụngfind . -exec mv '{}' ~/play/ \;