Di chuyển tệp với find + xargs: target không phải là một thư mục?


9

Khi tôi chạy lệnh sau:

> mkdir some_dir
> find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} some_dir

Tôi nhận được hàng trăm dòng nói:

mv: target `/foo/bar/XX.csv` is not a directory

Tại sao? Tôi nghĩ rằng xargs sẽ thực thi:

mv /foo/barXX.csv some_dir

cho mỗi tập tin findtìm thấy. Chuyện gì đang xảy ra vậy? Nhân tiện, đây là với zsh

Cập nhật:

Cập nhật1:

Tôi đã thử:

find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} -t some_dir

nhưng sau đó tôi nhận được một vài dòng như:

mv: cannot stat `{}': No such file or directory

mặc dù tôi nghĩ rằng lệnh đang di chuyển các tập tin của tôi một cách chính xác.

Cập nhật2:

Tôi dường như không cần -ttùy chọn khi sử dụng mvmột mình. Ví dụ

> touch file1.txt
> touch file2.txt
> mkdir my_dir
> mv  file1.txt  file2.txt  my_dir

hoạt động tốt Tại sao tôi cần -tkhi sử dụng xargs?

Câu trả lời:


14

Giả sử bạn có GNU ( find,, xargs& mv), hãy thay đổi lệnh của bạn thành điều này:

$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir

đoạn trích từ mvtrang người đàn ông

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

Ở trên xargs ...sẽ xây dựng lệnh để các lệnh gọi di chuyển sẽ như thế này:

 $ mv 1.csv 2.csv 3.csv ... -t some_dir

Đừng cần xargs

Bạn có thể bỏ qua phương pháp này bằng cách findtự mình thực hiện tất cả các công việc:

$ find /foot/bar/ -name '*.csv' -exec mv -t some_dir {} +

Tại sao bạn cần mv -t ...?

Điều này có liên quan đến cách xargsxây dựng tập hợp các tập tin truyền vào lệnh mà nó sẽ chạy mỗi lần, (tức là mv ...).

Khi bạn tự chạy mvlệnh một cách thủ công, bạn sẽ kiểm soát số lượng tên tệp được truyền cho nó và do đó bạn không cần phải lo lắng về việc cần thiết -t my_dirvì bạn sẽ luôn đặt thư mục đích cuối cùng.

Người giới thiệu


Cảm ơn! Điều này rất hữu ích. Tôi hơi bối rối mặc dù (xem Cập nhật của tôi)
Amelio Vazquez-Reina

1
Lệnh được xây dựng là mv -t some_dir 1.csv 2.csv 3.csv ...để các đối số tập tin là cuối cùng. Đó là lỗi trong câu hỏi, để sử dụng {}bạn phải vượt qua -I {}để xargs.
frostschutz

Cảm ơn. Điều đó giải thích mọi thứ. Còn câu hỏi thứ hai tôi có trong Bản cập nhật 2 thì sao? Bạn có biết tại sao tôi không cần -tnhiều tệp và thư mục thường xuyên mvkhông?
Amelio Vazquez-Reina

1
@ user815423426 - Tôi sẽ cập nhật nó sau khi tôi có cơ hội tối nay, tôi không biết tại sao.
slm

@ user815423426 - Tôi đã cập nhật câu hỏi, cho tôi biết nếu nó có ý nghĩa wrt mv -t.
slm

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.