ดูคำตอบของ Stephane สำหรับวิธีที่ดีที่สุดลองดูที่คำตอบของฉันด้วยเหตุผลที่จะไม่ใช้วิธีแก้ปัญหาที่ชัดเจนกว่านี้ (และเหตุผลที่ทำไมมันถึงไม่มีประสิทธิภาพมากที่สุด)
คุณสามารถใช้-I
ตัวเลือกของxargs
:
find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/
ซึ่งทำงานในกลไกคล้ายกับและfind
{}
ฉันจะเสนอราคา-name
อาร์กิวเมนต์ของคุณ(เนื่องจากไฟล์ที่เริ่มต้นด้วยx
ในไดเรกทอรีปัจจุบันจะเป็นไฟล์ขุ่นเคืองและส่งผ่านเป็นอาร์กิวเมนต์เพื่อค้นหา - ซึ่งจะไม่ให้พฤติกรรมที่คาดหวัง!)
อย่างไรก็ตามตามที่ชี้ให้เห็นโดย manatwork ตามรายละเอียดในxargs
man page:
-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.
สิ่งสำคัญที่ควรทราบคือ-L 1
หมายความว่าจะมีการประมวลผลเอาต์พุตเพียงบรรทัดเดียวfind
ในแต่ละครั้ง ซึ่งหมายความว่านั่นคือ syntactically เหมือนกับ:
find /tmp/ -ctime -1 -name "x*" -exec mv '{}' ~/play/
(ซึ่งดำเนินการmv
การดำเนินการเดียวสำหรับแต่ละไฟล์)
แม้การใช้-0
อาร์กิวเมนต์GNU xargs และfind -print0
อาร์กิวเมนต์ทำให้เกิดลักษณะการทำงานที่เหมือนกัน-I
- นี่คือclone()
กระบวนการสำหรับแต่ละไฟล์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/
แต่ตามที่มนุษย์บอกว่า“ โดยนัย-x
และ-L 1
” ดังนั้นจึงไม่ได้ประโยชน์ ควรทำให้ง่ายขึ้นและดีกว่าfind . -exec mv '{}' ~/play/ \;