chuyển các biến từ 'ls' sang 'tar' thông qua 'xargs'


9

Tôi đang cố gắng làm một cái gì đó như

ls -t | head -n 3 | xargs -I {} tar -cf t.tar {}

để lưu trữ 3 tệp đã sửa đổi lần cuối nhưng cuối cùng lại chạy lệnh tar riêng cho từng tệp và cuối cùng tôi chỉ còn lại một tệp tar chứa tệp cuối cùng trong số 3 tệp (theo thứ tự bất kỳ). Tôi biết tôi không sử dụng 'xargs' một cách chính xác nhưng tìm kiếm không giúp được gì; Tôi tìm thấy các ví dụ không hoạt động. Ngay cả lệnh đơn giản hơn

ls | xargs -I {} tar -cf t.tar {}

kết thúc với một tệp tar chỉ chứa một trong các tệp trong thư mục đó.

Câu trả lời:


8

ls -t | head -n 3 | xargs tar -cf t.tar

Làm việc cho tôi. Có một lý do bạn cần bộ -Icờ?


Nó chưa bao giờ xảy ra với tôi để thử điều đó; cảm ơn bạn rất nhiều! Nhưng nếu tôi thực sự muốn vượt qua họ với -I thì sao? Có cách nào để định dạng chính xác theo cách đó không?
oligilo

Nếu bạn muốn sử dụng -Icờ thì bạn nên sử dụng một cái gì đó ngoài {}việc thay thế. Ví dụls -t | head -n 3 | xargs -I foo tar -cf t.tar foo
David King

Tôi đã làm, nhưng tôi nhận được kết quả tương tự: chỉ tệp cuối cùng hoặc tương đương, nó chạy lệnh tar riêng cho từng mục.
oligilo

Sau khi đọc thêm trong trang man xargs ... -Ingụ ý -L 1có nghĩa là chạy lệnh sau cho mỗi 1 dòng đầu vào, đó là lý do tại sao bạn thấy kết quả của mình.
David King

Ah tôi thấy; Cảm ơn rất nhiều vì sự giúp đỡ của bạn; nó đã làm phiền tôi nhiều ngày. Tôi rất trân trọng điều này.
oligilo

0

Theo bài đăng này , tốt hơn là sử dụng rthay vì c, trong trường hợp cắt xargscác đầu vào, thu được một tệp tar chỉ chứa đoạn cuối cùng. Vì vậy, một giải pháp tốt hơn sẽ là:

rm -f t.tar 2>/dev/null  # remove tar if there
ls -t | head -n 3 | xargs tar -rf t.tar
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.