Tar một danh sách các tập tin không tồn tại


10

Tôi đang chạy một lệnh từ một kịch bản như

tar -c -f ar.tar a b c d

trong đó b, c và d có thể không tồn tại và có thể là các thư mục. Các giải pháp mà tôi đã đưa ra được đường ống đầu ra của ls -dđể grep, sau đó splicing nó vào tarlệnh, hoặc bật những đống mở rộng cho @(a|b|c|d).

Có cách nào gọn gàng hơn để làm điều này? Tôi đang sử dụng Debian Wheezy, dường như không có --includetham số.


Bạn có --ignore-failed-readlựa chọn không?
Costas

1
Đã thử nó, vẫn đưa ra một lỗi cho các tập tin hoàn toàn không tồn tại.
gidyn

1
Có, thông báo lỗi có mặt nhưng lưu trữ được tạo ra.
Costas

Câu trả lời:


8

bạn co thể thử

 tar cf ar.tar $(ls a b c d )

Ở đâu

  • c để tạo
  • f ar.tar chỉ định tập tin tar

  • $(ls a b c d) sẽ liệt kê cho stdin tập tin nào hiện diện thực sự (và đưa ra lỗi cho người khác)


2
tar cf ar.tar $(ls -d a b c d 2>/dev/null)hoạt động hoàn hảo .. nhưng tôi nghĩ nó sạch hơn với extglob
gidyn

bây giờ tôi đang chuyển tập lệnh sang dấu gạch ngang, vì vậy không extglob- tôi đang sử dụng mã trong nhận xét của mình ở trên
gidyn

1

Nếu bạn có thể có đường dẫn đầy đủ của các tệp trong kho lưu trữ tar, bạn có thể làm:

tar -c -f ar.tar $(readlink -e a b c d)

Các -etùy chọn để readlink sẽ canonicalize tên tập tin hiện có và âm thầm bỏ qua bất kỳ những người khác.


Tôi đoán rằng nó có thể làm việc nếu tôi --strip-componentstrong khi giải nén.
gidyn

0

Sử dụng

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Giải trình

  1. Tham số đầu tiên là thư mục bạn muốn tìm kiếm.
  2. Theo mặc định findkhông đệ quy.
  3. Các -oviết tắt cho -or. Vì vậy, ở trên có nghĩa là tìm kiếm ký tự đại diện này HOẶC cái này. Nếu bạn chỉ có một mẫu thì không cần -o.
  4. Các trích dẫn xung quanh mẫu ký tự đại diện là bắt buộc.
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.