2013-09-08 39 views
120

Tôi có lệnh sau đây trong một phần của một kịch bản shell sao lưu:Tar một thư mục, nhưng không lưu trữ đầy đủ đường dẫn tuyệt đối trong kho lưu trữ

tar -cjf site1.bz2 /var/www/site1/ 

Khi tôi liệt kê các nội dung của các kho lưu trữ, tôi nhận được :

tar -tf site1.bz2 
var/www/site1/style.css 
var/www/site1/index.html 
var/www/site1/page2.html 
var/www/site1/page3.html 
var/www/site1/images/img1.png 
var/www/site1/images/img2.png 
var/www/site1/subdir/index.html 

Nhưng tôi muốn để loại bỏ các phần /var/www/site1 từ tên thư mục và tập tin trong kho lưu trữ, để đơn giản hóa khai thác và tránh vô dụng cấu trúc thư mục không đổi. Không bao giờ biết, trong trường hợp tôi sẽ trích xuất các trang web được sao lưu ở nơi dữ liệu web không được lưu trữ dưới /var/www.

Đối với ví dụ trên, tôi muốn có:

tar -tf site1.bz2 
style.css 
index.html 
page2.html 
page3.html 
images/img1.png 
images/img2.png 
subdir/index.html 

Vì vậy, mà khi tôi giải nén, các file được giải nén trong thư mục hiện và tôi không cần phải di chuyển các file trích xuất sau đó, và vì vậy các cấu trúc thư mục con được giữ nguyên.

Đã có nhiều câu hỏi về tar và sao lưu trong stackoverflow và tại các địa điểm khác trên web, nhưng hầu hết trong số họ yêu cầu thả toàn bộ cấu trúc thư mục con (làm phẳng) hoặc chỉ thêm hoặc xóa cấu trúc ban đầu/trong tên (Tôi không biết những gì nó thay đổi chính xác khi giải nén), nhưng không có nhiều hơn nữa.

Sau khi đọc một số trong những giải pháp tìm thấy ở đây và ở đó cũng như hướng dẫn, tôi đã cố gắng:

tar -cjf site1.bz2 -C . /var/www/site1/ 
tar -cjf site1.bz2 -C//var/www/site1/ 
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/ 
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/ 

Nhưng không ai trong số họ làm việc theo cách tôi muốn. Một số không làm gì cả, một số khác không lưu trữ các thư mục con nữa. Đó là bên trong một kịch bản shell sao lưu được khởi động bởi một Cron, vì vậy tôi không biết rõ, người dùng nào chạy nó, đường dẫn và thư mục hiện tại là gì, vì vậy luôn luôn viết đường dẫn tuyệt đối là cần thiết cho mọi thứ và muốn không thay đổi thư mục hiện tại để tránh vi phạm thêm gì đó trong kịch bản (vì nó không chỉ sao lưu các trang web, mà còn cả cơ sở dữ liệu, sau đó gửi tất cả đến FTP vv)

Làm thế nào để đạt được điều này?

Tôi vừa hiểu nhầm tùy chọn -C hoạt động như thế nào?

+0

bản sao có thể có của [Cách sử dụng tar để lưu trữ tệp từ các thư mục khác nhau không có cấu trúc thư mục] (http://stackoverflow.com/questions/18675523/how-to-use-tar-to-archive-files-from- các thư mục khác nhau-không-directory-str) –

+0

Stack Overflow là một trang web cho các câu hỏi lập trình và phát triển. Câu hỏi này dường như không có chủ đề vì nó không phải là về lập trình hay phát triển. Xem [Tôi có thể hỏi những chủ đề gì ở đây] (http://stackoverflow.com/help/on-topic) trong Trung tâm trợ giúp. Có lẽ [Super User] (http://superuser.com/) hoặc [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/) sẽ là một nơi tốt hơn để hỏi. – jww

Trả lời

186
tar -cjf site1.tar.bz2 -C /var/www/site1 . 

Trong ví dụ trên, tar sẽ thay đổi vào thư mục /var/www/site1 trước khi làm việc của nó bởi vì tùy chọn -C /var/www/site1 đã được đưa ra.

Từ man tar:

OTHER OPTIONS 

    -C, --directory DIR 
     change to directory DIR 
+61

Đừng bỏ lỡ dấu chấm ở cuối, điều quan trọng ;-) –

+2

Còn nếu bạn cũng muốn chọn tệp sao lưu dựa trên ký tự đại diện? -C/var/www/site1 * .dat không hoạt động: ( –

+1

'(d = $ PWD && cd/var/www/site1 && tar -cjf $ d/site1.tar.bz2 * .dat)' –

10

Tùy chọn -C công trình; chỉ cần làm rõ tôi sẽ đăng 2 ví dụ:

  1. tạo ra một tarball mà không cần đường dẫn đầy đủ: đường dẫn đầy đủ /home/testuser/workspace/project/application.war và những gì chúng tôi muốn chỉ là project/application.war vậy:

    tar -cvf output_filename.tar -C /home/testuser/workspace project 
    

    Lưu ý: có khoảng cách giữa workspaceproject; tar sẽ thay thế đường dẫn đầy đủ chỉ với project.

  2. khai thác tarball với việc thay đổi đường dẫn đích (mặc định để ., tức là thư mục hiện hành)

    tar -xvf output_filename.tar -C /home/deploy/ 
    

    tar sẽ trích xuất tarball dựa trên con đường nhất định và duy trì con đường sáng tạo; trong ví dụ của chúng tôi, tệp application.war sẽ được trích xuất thành /home/deploy/project/application.war.

    /home/deploy: đưa ra trên chiết xuất
    project: đưa ra trên tạo ra các tarball

Lưu ý: nếu bạn muốn đặt tarball được tạo ra trong một thư mục mục tiêu, bạn chỉ cần thêm đường dẫn đích trước tên tarball. ví dụ:

tar -cvf /path/to/place/output_filename.tar -C /home/testuser/workspace project 
+1

cách thêm ký tự đại diện để chọn tệp trong ví dụ cuối cùng? – Siva

+0

Vấn đề với ký tự đại diện là trình bao mở rộng chúng thành các tên tệp phù hợp và tar đó không mở rộng chúng nếu chúng được trích dẫn ... –

2

Có vẻ nhiều người đã hiểu nhầm tùy chọn -C trong tar.

tar target_path/file.tar.gz -C source_path/source_dir . 

hoặc

tar target_path/file.tar.gz -C source_path/source_dir 

sẽ không loại bỏ hoàn toàn con đường tiền tố bên trong tập tin tar.gz tạo ra.

Giải pháp đơn giản nhất là cd để source_path (thư mục cha của source_dir) và chạy

tar target_path/file.tar.gz source_dir 

trong kịch bản của bạn. Điều này sẽ loại bỏ tiền tố đường dẫn tuyệt đối trong cấu trúc thư mục của tệp tar.gz được tạo của bạn.

3

Lệnh sau sẽ tạo thư mục gốc "." và đặt tất cả các tệp từ thư mục được chỉ định vào thư mục đó.

tar -cjf site1.tar.bz2 -C /var/www/site1 . 

Nếu bạn muốn đặt tất cả các tệp vào thư mục gốc của tệp tar, @chinthaka là đúng. Chỉ cần cd vào thư mục và làm:

tar -cjf target_path/file.tar.gz * 

Điều này sẽ đặt tất cả các tệp trong tệp cwd vào tệp tar dưới dạng tệp gốc.

+0

Sử dụng * không lưu bất kỳ ".files" hoặc .folders bị ẩn. (fyi, sử dụng -C cùng với * không thành công, shell mở rộng dir hiện tại, không phải là -C dir) – Xen2050

Các vấn đề liên quan