ดีสำหรับสิ่งหนึ่งที่-i
สวิตช์เลิกใช้แล้ว:
-i[replace-str]
This option is a synonym for -Ireplace-str if replace-str is specified.
If the replace-str argument is missing, the effect is the same as -I{}.
This option is deprecated; use -I instead.
ดังนั้นเมื่อฉันเปลี่ยนคำสั่งของคุณเป็นแบบนี้มันทำงานได้:
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
ตัวอย่าง
$ find . -print0 | xargs -I{} -0 echo {}
.
./.sshmenu
./The GIT version control system.html
./.vim_SO
./.vim_SO/README.txt
./.vim_SO/.git
./.vim_SO/.git/objects
./.vim_SO/.git/objects/pack
./.vim_SO/.git/objects/pack/pack-42dbf7fe4a9b431a51da817ebf58cf69f5b7117b.idx
./.vim_SO/.git/objects/pack/pack-42dbf7fe4a9b431a51da817ebf58cf69f5b7117b.pack
./.vim_SO/.git/objects/info
./.vim_SO/.git/refs
./.vim_SO/.git/refs/tags
...
การใช้ -I{}
ไม่ควรใช้วิธีนี้ตั้งแต่เริ่มสร้างคำสั่งนี้:
$ find -print0 ... | xargs -I{} -0 ...
โดยปริยายจะเปิดสวิทช์เหล่านี้เพื่อxargs
, และ-x
-L 1
การ-L 1
กำหนดค่าxargs
เพื่อให้มันเรียกคำสั่งที่คุณต้องการให้เรียกใช้ไฟล์ในแบบเดียว
ดังนั้นนี่จะเป็นการทำลายจุดประสงค์ของการใช้xargs
ที่นี่เพราะถ้าคุณให้ไฟล์ 1,000 ไฟล์มันจะทำงานmv
คำสั่ง 1,000 ครั้ง
ดังนั้นฉันควรใช้วิธีการแบบไหน?
คุณสามารถทำได้โดยใช้ xargs ดังนี้:
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
หรือเพียงแค่ได้พบทำมันทั้งหมด:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +
"This approach shouldn't be used"
ควรใช้วิธีการใดแทน จะ"find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir'"
เป็นทางออกที่ดีกว่า ถ้าเป็นเช่นนั้นว่าไม่xargs
ทราบว่าในกรณีนี้ที่อยู่ในmv
คำสั่งไปยังฟีดในข้อโต้แย้งที่จะได้รับจากท่อ? (มันมักจะวางพวกเขาครั้งสุดท้าย?)