Vâng, vì một điều mà công -i
tắc không được chấp nhận:
-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.
Vì vậy, khi tôi thay đổi lệnh của bạn xung quanh điều này, nó đã hoạt động:
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
Thí dụ
$ 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
...
Sử dụng -I{}
Cách tiếp cận này không nên được sử dụng kể từ khi chạy cấu trúc lệnh này:
$ find -print0 ... | xargs -I{} -0 ...
ngầm bật các công tắc này sang xargs
, -x
và -L 1
. Các -L 1
cấu hìnhxargs
để nó gọi các lệnh mà bạn muốn nó chạy các tệp thông qua một cách duy nhất.
Vì vậy, điều này đánh bại mục đích sử dụng xargs
ở đây vì nếu bạn cung cấp cho nó 1000 tệp, nó sẽ chạymv
lệnh 1000 lần.
Vậy tôi nên sử dụng phương pháp nào sau đó?
Bạn có thể làm điều đó bằng cách sử dụng xargs như thế này:
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
Hoặc chỉ cần tìm làm tất cả:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +
"This approach shouldn't be used"
phương pháp nào nên được sử dụng thay thế sau đó? Sẽ"find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir'"
là một giải pháp tốt hơn? Nếu vậy, làm thế nào đểxargs
biết trong trường hợp này trongmv
lệnh trong nguồn cấp dữ liệu mà nó nhận được từ đường ống? (nó có luôn đặt chúng cuối cùng không?)