Cách làm cho tar globalbing hoạt động với tùy chọn 'thay đổi thư mục'


8

Tôi có cấu trúc thư mục followin:

base/
   files/
   archives/
   scripts/

Tôi muốn có một kịch bản để chạy từ scripts/, các file nén mà trận đấu results.*.logtrong files/thành đã giải nén tar lưu trữ trong archives/.

Tôi đang thử lệnh sau:

tar czfC ../archives/archive.tar.gz ../files results.*.log

Nhưng tôi hiểu

tar: results.*.log: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

Trong khi

tar czfC ../archives/archive.tar.gz ../files results.a.log

hoạt động như mong đợi. Cũng thế

tar czf ../archives/archive.tar.gz ../files/results.*.log

hoạt động theo cách tôi muốn, ngoại trừ việc thêm tiền tố files/vào tệp và cũng phát ra cảnh báo:

tar: Removing leading `../' from member names

Vì vậy, kết luận của tôi là targlobalbing không hoạt động đúng khi sử dụng -Ctùy chọn. Có lời khuyên nào về cách tôi thực hiện công việc này một cách đơn giản không?

Câu trả lời:


3

Viết nó theo cách dễ mang theo hơn:

(cd ../files && tar cf - results.*.log) | 
  gzip -9 > ../archives/archive.tar.gz

Toàn cầu vẫn sẽ được giải thích trong thư mục hiện tại, trước khi cdxảy ra.
vonbrand

1
@vonbrand, không, tất nhiên rồi. &&là like ;hoặc newline, nó phân tách hai lệnh. Giống như nói rằng sau khi chạy cd, bất kỳ quả cầu nào cũng sẽ mở rộng các tệp trong thư mục trước đó.
Stéphane Chazelas

Bạn đúng rồi. Một người không bao giờ hoàn thành việc học.
vonbrand

5

Không có "tar Globing", việc tạo hình được thực hiện bằng vỏ. Và shell không có ý tưởng nào tar -C somedirsẽ thực hiện công việc của nó somedir, bất kỳ khối lượng nào được mở rộng trong thư mục hiện tại.


Thật vậy, nếu results.a.logtồn tại trong thư mục mà kịch bản được chạy, nó hoạt động. Nhưng tôi không hiểu tại sao điều này xảy ra, vì -Cviết tắt của thư mục thay đổi, vì vậy thư mục hiện tại nên là thư mục có results.a.log. Tôi không thể chấp nhận câu trả lời của bạn vì bạn không đưa ra giải pháp.
Yuval

2
Shell nhận lệnh, mở rộng các khối trong thư mục hiện tại, tạo các đối số từ bên trên và khởi chạy tarchương trình, thay đổi thư mục sau đó nhiều. Không thể "giải quyết" vấn đề của bạn, xin lỗi. Cách duy nhất là di chuyển vào thư mục mà bạn muốn toàn cầu hoặc thực hiện việc tạo khối trong thư mục và lưu kết quả của nó trong một tệp hoặc biến.
vonbrand

1

Bạn có thể cho phép findthực hiện toàn cầu hóa và bỏ qua tùy chọn 'thay đổi thư mục' tarbằng cách xóa files/tiền tố trước khi tạo tarfile.

Các --no-recursiontùy chọn để tarkhông bắt buộc vì không có thư mục sẽ được lưu trữ.

cd base/scripts

# gnutar
# printf '%s\000' ../files/results.*.log |  # find alternative
find ../files -maxdepth 1 -type f -name "results.*.log" -print0 | 
   gnutar --transform="s|^\.\{0,1\}\.\{0,1\}/\{0,1\}files/||" -cf - --null --no-recursion -T - | 
   gzip -9 > ../archives/archive.tar.gz
gnutar -tf ../archives/archive.tar.gz | nl
gnutar -xzf ../archives/archive.tar.gz

# bsdtar
find ../files -maxdepth 1 -type f -name "results.*.log" -print0 | 
   bsdtar -s "|^\.\{0,1\}\.\{0,1\}/\{0,1\}files/||" -cf - --null --no-recursion -T - | 
   gzip -9 > ../archives/archive.tar.gz
bsdtar -tf ../archives/archive.tar.gz | nl
bsdtar -xzf ../archives/archive.tar.gz

0

Cuối cùng tôi đã sử dụng

tar czfC ../archives/archive.tar.gz ../files `find ../files/results.*.log -printf "%f\n"`

Trong khi điều đó có thể làm việc cho bạn, đó là một cách khá phức tạp để làm điều đó. Hơn nữa, nó sẽ không hoạt động với tên tệp chứa các ký tự đặc biệt như khoảng trắng. Sử dụng một trong những phương pháp lành mạnh đã được đề xuất trong câu trả lời.
Gilles 'SO- ngừng trở nên xấu xa'

0

Cách để làm điều đó là viết một cái gì đó như sau:

#!/bin/sh

cd ../files
tar zcf ../archives/archive.tar.gz results.*.log
cd ../scripts

0

Nó không phải là tar mà làm hình cầu, đó là vỏ. Trước tiên, bạn nói với shell để thực hiện Globing, sau đó nói với tar để thay đổi thư mục. Vì tar đang nhận được một danh sách các tên tệp liên quan đến các thư mục gốc, nên điều này không hoạt động.

Giải pháp đơn giản nhất cho đến nay là để shell thay đổi thư mục. Tương tác:

cd ../files
tar czf ../archives/archive.tar.gz  results.*.log
cd -

Trong một kịch bản:

(
  cd ../files &&
    tar czf ../archives/archive.tar.gz  results.*.log
)

hoặc là

(
  cd ../files &&
    tar czf -  results.*.log
) >../archives/archive.tar.gz
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.