Tôi đang thử cái này và nó không hoạt động:
ls file_* | xargs mv {} temp/
Có ý kiến gì không?
Tôi đang thử cái này và nó không hoạt động:
ls file_* | xargs mv {} temp/
Có ý kiến gì không?
Câu trả lời:
Trên OS X:
ls file_* | xargs -J {} mv {} temp/
Trên Linux:
ls file_* | xargs -i {} mv {} temp/
/
cuối cùng là tùy chọn. Bạn có thể bao gồm nó nếu bạn muốn, nhưng nó không cần thiết.
-i
(hoặc -J
) chỉ định mã thông báo sẽ được thay thế bằng các đối số đến, thay vì chúng chỉ được xử lý ở cuối. man xargs
-i{}
, không có không gian. Hay nói -I {}
.
-i
là gì, nó sẽ được thay thế. ls file_* | xargs -iFOO mv FOO temp/
hoạt động chính xác như nhau.
find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;
find
tốt hơn ls
nơi có thể có nhiều tệp hơn số lượng đối số chương trình được cho phép bởi trình bao của bạn.
file_*
tệp trong thư mục hiện tại, trong khi find
(không có tùy chọn bổ sung) sẽ tìm kiếm toàn bộ cây thư mục trong thư mục hiện tại.
mv
dù không quan tâm nếu bạn xử lý các tệp cùng nhau hoặc riêng lẻ, một số cách sử dụng khác có thể.
Theo đề xuất của @ user1953864: { -i
, -J
} chỉ định mã thông báo sẽ được thay thế bằng các đối số đến.
Ví dụ ls
:
something.java exampleModel.java NewsQueryImpl.java readme someDirectory/
Sau đó, để di chuyển tất cả các tệp java vào thư mục someDirectory xargs
như sau:
Trên Linux
ls *.java | xargs -i mv {} someDirectory/
Trên MacOS
ls *.java | xargs -J mv {} someDirectory
Một giải pháp khác có thể là:
for f in file_* ; do
mv $f temp/$f
done
Nhược điểm là nó tạo ra một mv
quy trình mới cho mỗi tệp.
xargs -n10
ví dụ)