tar -C với mẫu tệp ký tự đại diện


17

Tôi có thể sử dụng lệnh tar để thay đổi thư mục và sử dụng mẫu tệp ký tự đại diện không?

Đây là những gì tôi đang cố gắng làm:

tar -cf example.tar -C /path/to/file *.xml

Nó hoạt động nếu tôi không thay đổi thư mục (-C), nhưng tôi đang cố tránh các đường dẫn tuyệt đối trong tệp tar.

tar -cf example.tar /path/to/file/*.xml

Dưới đây là một số nỗ lực khác mà tôi đã thực hiện:

tar -cf example.tar -C /path/to/file *.xml
tar -cf example.tar -C /path/to/file/ *.xml
tar -cf example.tar -C /path/to/file/ ./*.xml
tar -cf example.tar -C /path/to/file "*.xml"

Và đây là lỗi tôi nhận được:

tar: *.xml: Cannot stat: No such file or directory

Tôi biết có nhiều cách khác để làm cho công việc này (sử dụng find, xargs, v.v.) nhưng tôi đã hy vọng thực hiện điều này chỉ bằng lệnh tar.

Có ý kiến ​​gì không?

Câu trả lời:


18

Vấn đề là, * .xml được giải thích bởi shell chứ không phải bởi tar. Do đó, các tệp xml mà nó tìm thấy (nếu có) nằm trong thư mục bạn đã chạy lệnh tar trong.

Bạn sẽ phải sử dụng thao tác nhiều giai đoạn (có thể liên quan đến đường ống) để chọn các tệp bạn muốn và sau đó tar chúng.

Cách dễ nhất chỉ là cdvào thư mục chứa các tệp:

$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)

nên làm việc.

Các dấu ngoặc nhóm các lệnh lại với nhau, vì vậy khi chúng kết thúc, bạn vẫn sẽ ở trong thư mục gốc của mình. && có nghĩa là ý tarchí chỉ chạy nếu ban đầu cdthành công.


9

Trong một trong những nỗ lực của bạn:

tar -cf example.tar -C /path/to/file "*.xml"

ký tự * thực sự được truyền cho tar. Tuy nhiên, vấn đề là tar chỉ hỗ trợ khớp ký tự đại diện trên tên của các thành viên của kho lưu trữ. Vì vậy, trong khi bạn có thể sử dụng các ký tự đại diện khi trích xuất hoặc liệt kê các thành viên từ kho lưu trữ, bạn không thể sử dụng các ký tự đại diện khi bạn đang tạo một kho lưu trữ.

Trong những tình huống như vậy tôi thường tìm đến (như bạn đã đề cập). Nếu bạn có GNU find, nó có tùy chọn đẹp để chỉ in đường dẫn tương đối, sử dụng tùy chọn -printf:

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.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.