Làm cách nào tôi có thể di chuyển tệp với xargs trên Linux?


24

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?


Bất cứ ai có một phiên bản di chuyển nhiều tập tin này? ( xargs -n10ví dụ)
Gert van den Berg

Câu trả lời:


31

Trên OS X:

ls file_* | xargs -J {} mv {} temp/

Trên Linux:

ls file_* | xargs -i {} mv {} temp/

1
Trên Linux, ít nhất, /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.
Scott

4
@ user1953864: -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
Amadan

14
Bạn có thể cần phải nói -i{}, không có không gian. Hay nói -I {}.
Scott

1
Tôi nhận thấy rằng việc sử dụng "%" thay cho "{}" cũng hoạt động -% có nghĩa là gì và {} có nghĩa là gì? Ví dụ: tập tin ls_ * | xargs -I% mv% temp /
độc quyền

3
@dmonopoly: Chúng không có nghĩa gì cả. Dù tham số -ilà gì, nó sẽ được thay thế. ls file_* | xargs -iFOO mv FOO temp/hoạt động chính xác như nhau.
Amadan

8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findtốt hơn lsnơ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.


2
Lưu ý rằng câu hỏi gợi ý mong muốn chỉ xử lý các 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.
Scott

1
Vâng đúng. Thêm vào -maxdepth 0để ngăn chặn điều này.

"tốt hơn" là chủ quan. Mạnh hơn, phức tạp hơn và chậm hơn; và mặc mvdù 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ể.
Amadan

Đã chỉnh sửa (đã thêm -maxdepth 0)

8

Sử dụng -t "chỉ định kiểu mẫu đích" tại mv, nó sẽ hoạt động khi di chuyển tệp * đến thư mục đích / temp

ví dụ: - #ls -l tệp * | xargs mv -t / temp


4

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 xargsnhư sau:

Trên Linux

ls *.java | xargs -i mv {} someDirectory/

Trên MacOS

ls *.java | xargs -J mv {} someDirectory

0

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 mvquy trình mới cho mỗi tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.