Làm thế nào để tar thư mục và sau đó loại bỏ bản gốc bao gồm cả thư mục?


30

Tôi đang cố gắng tartập hợp các tệp trong thư mục có tên 'my_directory' và xóa bản gốc bằng cách sử dụng lệnh:

tar -cvf files.tar my_directory --remove-files

Tuy nhiên, nó chỉ loại bỏ các tệp riêng lẻ trong thư mục chứ không phải chính thư mục (đó là những gì tôi đã chỉ định trong lệnh). Tôi đang thiếu gì ở đây?

CHỈNH SỬA:

Có, tôi cho rằng tùy chọn 'remove-files' hoàn toàn theo nghĩa đen. Mặc dù tôi cũng tìm thấy trang người đàn ông không rõ ràng về điểm đó. (Trong linux tôi có xu hướng không thực sự phân biệt nhiều giữa các thư mục và tệp nhiều và đôi khi quên rằng chúng không giống nhau). Có vẻ như sự đồng thuận là nó không xóa các thư mục.

Tuy nhiên, điểm chính của tôi khi đặt câu hỏi này bắt nguồn từ việc xử lý các đường dẫn tuyệt đối của tar. Vì bạn phải chỉ định đường dẫn tương đối cho tệp / s được nén, do đó bạn phải thay đổi thư mục cha để tar đúng cách. Như tôi thấy nó sử dụng bất kỳ loại lệnh 'rm' tiếp theo nào đều có khả năng gây nguy hiểm trong tình huống đó. Vì vậy, tôi đã hy vọng đơn giản hóa mọi thứ bằng cách tự làm tar.

Ví dụ, hãy tưởng tượng một tập lệnh sao lưu trong đó thư mục cần sao lưu (ví dụ: tar) được bao gồm dưới dạng biến shell. Nếu giá trị biến shell đó được nhập sai, có thể kết quả có thể bị xóa các tệp khỏi bất kỳ thư mục nào bạn đã ở cuối cùng.


Nicholas, quan điểm của bạn rằng nó thêm nguy hiểm khi phải loại bỏ cây thư mục trong một bước bổ sung là hoàn toàn hợp lệ. Tôi nghĩ rằng nó có thể được thực hiện một cách an toàn bởi người lưu trữ. Tôi cũng tin rằng đây là ý định của những người tạo ra GNU tar, ít nhất là nó phải có ;-)
mit 14/11/11

2
Tôi đã thấy rằng tùy chọn --remove-files thực sự loại bỏ thư mục chứa - ít nhất là trên một số nền tảng / trong một số phiên bản - và trong trường hợp của tôi. Có thể là trong trường hợp của bạn, thư mục còn lại không hoàn toàn trống do một số tệp bị sửa đổi sau khi bị xóa.
isync

@isync Tôi dường như đang gặp phải --remove-files xóa các thư mục trên Ubuntu 14.04. Ngoại trừ trong trường hợp của tôi, tôi không muốn nó. Haha
Bradley Odell

Câu trả lời:


12

Bạn đang thiếu phần cho biết --remove-filestùy chọn sẽ xóa các tệp sau khi thêm chúng vào kho lưu trữ.

Bạn có thể thực hiện theo thao tác lưu trữ và xóa tệp bằng một lệnh như,

tìm / đường dẫn / đến / được / lưu trữ / -depth -type d -empty -exec rmdir {} \;


Cập nhật: Bạn có thể quan tâm đến việc đọc cuộc thảo luận ngắn về Debian này,
Bug 424692: --remove-files phàn nàn rằng các thư mục "đã thay đổi khi chúng ta đọc nó" .


Có lẽ đó thực sự là: -cthay đổi thư mục trước khi tarbắt đầu công việc của nó (và loại không trở lại cho đến khi hoàn thành)? Tôi đoán nó sẽ xóa các thư mục con, nếu chúng được đưa vào kho lưu trữ (nhưng tôi chưa kiểm tra điều đó).
Arjan

@Arajan, tôi không nghĩ ' c'có liên quan gì đến việc này; 'remove-files'cố ý không xóa thư mục.
nik

Aha, tôi thấy lời giải thích ngắn gọn "xóa các tệp sau khi thêm chúng vào kho lưu trữ" từ các mantrang không quá rõ ràng về điều đó, nhưng tôi cho rằng bạn đã đúng. Tuy nhiên, tôi không mong muốn thư mục được đề cập -csẽ bị xóa ngay cả khi tar đã xóa thư mục. (Đối với tôi, điều đó sẽ giống như loại bỏ thư mục hiện hành, do đó bao gồm các kho lưu trữ chính nó, khi không sử dụng -c...?) Nhưng nếu -remove-filesluôn lá thư tại chỗ thì tôi chắc chắn chỉ làm phức tạp mọi thứ ở đây. ;-)
Arjan

3
--remove-fileslỗi đã được sửa trong tar-1.19.
x-yuri

19

--remove-filestùy chọn chỉ xóa các tệp , bạn có thể thử

tar -cvf files.tar my_directory && rm -R my_directory

để thư mục bị xóa chỉ khi tartrả về trạng thái thoát là 0


9
ngoại trừ việc bạn nên kiểm tra trạng thái thoát của tar trước khi thực hiện rm! nếu không, bạn có thể không còn lưu trữ tar và không có tệp ...
Kim

1
Khi sử dụng các thư mục một cấp, tôi tin rằng một tùy chọn an toàn hơn sẽ là sử dụng 'rmdir' thay vì 'rm' vì nó sẽ chỉ xóa một thư mục trống. [Xem chỉnh sửa câu hỏi]
Nicholas

Nhưng rmdirchỉ loại bỏ các thư mục trống . Ý tưởng là xóa thư mục các tệp trong đó (với điều kiện tarlà thành công)
pavium

--remove-fileslỗi đã được sửa trong tar-1.19.
x-yuri

&& sẽ chỉ chạy lệnh sau, nếu lệnh trước đó thoát 0 (thành công). Nếu nó thoát> 0, lệnh sau sẽ không được chạy. Bạn cũng có thể đảo ngược điều đó với | | - chỉ chạy nếu lệnh đầu tiên thất bại. Cách tốt để làm kiểm tra lại nội dung khủng khiếp đó.
Kirrus

6

Bạn đã thử đặt lệnh --remove-files sau tên lưu trữ chưa? Nó làm việc cho tôi.

tar -cvf files.tar --remove-files my_directory

1
Nhiều khả năng hành vi của tar đã thay đổi kể từ khi câu hỏi này được đặt ra. Đối với tôi, không có sự khác biệt trong việc đặt --remove-filestrước hoặc sau my_directory; trong cả hai trường hợp, thư mục được loại bỏ.
đốt cháy

5
--remove-fileslỗi đã được sửa trong tar-1.19.
x-yuri

1
source={directory argument}

ví dụ

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

ví dụ

parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

Sau đó, bạn có thể thực hiện một cái gì đó dọc theo dòng:

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [ $? != 0 ]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi

1

Đây có lẽ là một lỗi.

Ngoài ra từ "tập tin" là mơ hồ trong trường hợp này. Nhưng bởi vì đây là một chuyển đổi dòng lệnh, tôi mong đợi nó cũng có nghĩa là các thư mục, bởi vì trong unix / lnux, mọi thứ đều là một tệp, cũng là một thư mục. (Giải thích khác tất nhiên cũng hợp lệ, nhưng sẽ không có ý nghĩa gì khi giữ các thư mục trong trường hợp như vậy. Tôi sẽ coi đó là hành vi bất ngờ và khó hiểu.)

Nhưng tôi đã thấy rằng trong gnu tar trên một số bản phân phối gnu tar thực sự loại bỏ cây thư mục. Một dấu hiệu khác cho thấy việc giữ cây là một lỗi. Hoặc ít nhất một số cách giải quyết cho đến khi họ sửa nó.

Đây là những gì tôi đã thử trên bảng điều khiển Ubuntu 10.04:

mit: / var / tmp $ mkdir cây1                                                                                               
mit: / var / tmp $ mkdir cây1 / sub1                                                                                          
mit: / var / tmp $> cây1 / sub1 / file1                                                                                        

mit: / var / tmp $ ls -la                                                                                                    
drwxrwxrwt 4 gốc 4096 2011-11-14 15:40.                                                                              
drwxr-xr-x 16 root root 4096 2011 / 02-25 03:15 ..
drwxr-xr-x 3 mit 4096 2011-11-14 15:40 cây1

mit: / var / tmp $ tar -czf tree1.tar.gz tree1 / --remove-files

# NHƯ BẠN CÓ THỂ XEM BÂY GIỜ ĐƯỢC GỌI NGAY BÂY GIỜ:

mit: / var / tmp $ ls -la
drwxrwxrwt 3 gốc 4096 2011-11-14 15:41.
drwxr-xr-x 16 root root 4096 2011 / 02-25 03:15 ..
-rw-r - r-- 1 mit mit 159 2011-11-14 15:41 cây1.tar.gz                                                                   


mit: / var / tmp $ tar - chuyển đổi                                                                                             
tar (GNU tar) 1.22                                                                                                           
Bản quyền © 2009 Free Software Foundation, Inc.

Nếu bạn muốn nhìn thấy nó trên máy của mình, hãy tự dán nó vào bảng điều khiển:

tar -version                                                                                             
cd / var / tmp
mkdir -p cây1 / sub1                                                                                          
> cây1 / sub1 / file1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -la
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.