tạo một kho lưu trữ tar mà không bao gồm thư mục cha


62

Tôi đang cố gắng tạo ra một chương trình đồ họa cho kịch bản của tôi.

Bên trong kịch bản tôi sử dụng tar để tạo một kho lưu trữ tar.

Từ chương trình đồ họa, tôi nhận được tên đầy đủ của tệp mà tôi muốn tạo một kho lưu trữ tar.

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

Kho lưu trữ tar của tôi bao gồm nhà, tên người dùng, dir1, dir2 và chọndir trong khi tôi muốn tar chỉ tạo lưu trữ bao gồm cả được chọn.

Câu trả lời:


79

Bạn có thể sử dụng -Ctùy chọn tarđể thực hiện điều này:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

Từ trang người đàn ông của tar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.

Bạn có biết làm thế nào tôi có thể chia $ path thành selectdir và đường dẫn tới / home / username / dir1 / dir2 để tôi có thể sử dụng tùy chọn -C
Sujit Maharjan

@SujitMaharjan bạn có thể sử dụng dirnameđể trích xuất mọi thứ cho đến khi "được chọn" và basenameđể giải nén "đã chọn". Hãy thử hai lệnh với đường dẫn $ làm đối số.
mkc

2
Đáng nói thêm rằng điều này hợp lệ cho cả GNU và BSD Tar.
Luke Exton

5
Lưu ý rằng bạn không thể sử dụng Globing với tùy chọn -C. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'sẽ không làm việc
Christian Long

Không hoạt động: tar:
chọndir

11

Có hai phương pháp mà bạn có thể sử dụng để tiếp cận vấn đề này.

Điều đầu tiên, theo tôi, là dễ dàng hơn. Đơn giản chỉ cần cdvào thư mục trực tiếp trên thư mục bạn muốn nén. Trong trường hợp này nó sẽ được dir2.

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

Cách thứ hai là sử dụng tùy chọn --transformcó một sedbiểu thức và chạy nó với tên tệp. Lưu ý: bạn sẽ phải thoát /trong sedbiểu thức.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'

Phương thức đầu tiên có cần một dấu chấm (.) Ở cuối không? Tôi đã thử nó mà không có tar: Cowardly refusing to create an empty archive. Khi tôi có dấu chấm, thật khó chịu khi root chứa một thư mục có tên .. Vì vậy, gần gũi nhưng không hoàn hảo.
JW01

1
Hơn nữa để bình luận trước đây của tôi. Tôi đã giải quyết vấn đề của mình. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *đã làm cho tôi. Sử dụng dấu hoa thị thay vì dấu chấm .. Cập nhật: Woops - Mặc dù tôi đã mất các tập tin ẩn.
JW01

6

Đầu tiên, vào thư mục làm việc,

cd /your/working/directory/ 

Sau đó sử dụng phép thuật *:-)

tar -cvf temp.tar *

Tôi đang cố lưu trữ các thư mục ẩn và nếu tôi thêm chúng trực tiếp (Không *) thì nó hoạt động, nhưng khi sử dụng * nó chỉ thêm tên của kho lưu trữ vào kho lưu trữ ...
Ole

1

Thật ra, tôi đã tìm thấy một vấn đề khi sử dụng câu trả lời của Ketan

tar -C / home / tên người dùng / dir1 / dir2 -cvf temp.tar chọndir

Khi bạn muốn sao chép tất cả các tệp chỉ trong dir2, chỉ cần tất cả các tệp thì trước tiên tôi đưa ra ý tưởng:

tar -C / nhà / tên người dùng / dir1 / dir2 -cvf temp.tar *

Tuy nhiên, khi bạn không ở trong thư mục dir2, nó sẽ gây ra sự cố vì * sẽ tar các tệp trong diectroy hiện tại của bạn. Và tôi đã khắc phục vấn đề bằng cách sử dụng lệnh dưới đây:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./

6
Nhưng sau đó, kho lưu trữ temp.tar của bạn chứa .dưới dạng một thư mục gốc.
cgrim
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.