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 -I
tù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ự find
và {}
. Tôi cũng sẽ trích dẫn -name
đối số của bạn (vì một tệp bắt đầu x
trong 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 xargs
trang 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 1
có nghĩa là chỉ một dòng đầu ra từ find
sẽ đượ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 mv
thao 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-x
và-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/ \;