Làm thế nào để tôi tar dot tập tin nhưng không chấm thư mục


1

Lệnh tar sau đây sẽ loại trừ tất cả các tệp chấm và thư mục dấu chấm.

tar -cvzf /media/bjackfly/bkup/bkup.gz --exclude '.*' --one-file-system /home/bjackfly

Trong trường hợp của tôi, tôi muốn các tệp chấm được sao lưu trong thư mục chính ( .vimrc, .bashrc) , v.v. nhưng không phải các thư mục dấu chấm, /.config /.cache /.eclipsev.v.

Bất kỳ chuyên gia Linux nào có lệnh cho việc này, hoặc tôi có cần chạy tìm kiếm vào tar hoặc thực hiện hai lệnh tar khác nhau không lý tưởng không? Một cho các tập tin dấu chấm trong thư mục nhà và một cho tất cả mọi thứ khác?


Tại sao bạn không muốn các thư mục ẩn? Chúng cũng là một phần của cấu hình người dùng.
Ignacio Vazquez-Abrams

Chủ yếu là vì tôi không biết làm thế nào để ghost hoặc khôi phục hình ảnh linux. Tôi muốn học mặc dù. Trước đây, tôi chỉ sao lưu tất cả các tệp dữ liệu của mình và các tệp chấm như .vimrc, v.v. và sau đó thường phải trải qua quá trình cài đặt lại hệ điều hành các ứng dụng và tất cả các công cụ như nhật thực, v.v. Nếu bạn có một số lời khuyên về cách khôi phục linux Ubuntu như một hình ảnh sẽ rất tuyệt
bjackfly

[đây là một câu hỏi rất giống nhau] [1]. câu trả lời được chọn là khá thanh lịch và súc tích. [1]: unix.stackexchange.com/questions/83661/ từ
sudoman

@ IgnacioVazquez-Abrams Điều đó không liên quan đến câu hỏi của anh ấy.
felwithe

@felwithe: Đó là nếu nó sẽ để lại 90% hồ sơ của họ phía sau.
Ignacio Vazquez-Abrams

Câu trả lời:


2

Để nén các tập tin dấu chấm trong thư mục nhà của bạn:

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

Nếu bạn muốn bao gồm các thư mục:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

Đây ?là tùy chọn trong lệnh đầu tiên, nhưng không phải trong lệnh thứ hai, nếu không, findsẽ bao gồm '.'thư mục.

(cảm hứng lấy từ đây .)


1

Tôi không biết làm thế nào để làm điều này trong một lần, nhưng bạn có thể chạy lệnh của mình và tạo một tệp tar, sau đó sử dụng findlệnh để nối thêm phần còn thiếu. thư mục.

Cái gì đó như $ find -type d -regex '\..+' -exec tar -r {} /media/bjackfly/bkup/bkup.gz \;

Tôi chưa thử lệnh này khi tôi đang ngồi trên máy Windows và không có quyền truy cập vào trình bao, nhưng bạn sẽ có thể thực hiện lệnh này bằng cách sử dụng lệnh này hoặc phương sai của nó. Tôi không chắc chắn nếu lệnh này sẽ nhận ...thư mục đến.

Chúc mừng.


Ít nhất là trên cygwin, nó không nhận /., vì vậy bạn có thể muốn thay đổi dấu hoa thị đó thành một điểm cộng.
Bobby

Cảm ơn tôi đã kết thúc việc tạo 2 tệp riêng biệt nhưng tôi sẽ thử cách của bạn để chỉ nối thêm. # sao lưu các tệp khác loại trừ dấu chấm dir tar -cvzf "$ BACKUPDIR / $ BKUPFILE" --exclude '. *' --one-file-system "$ SRCDIR" `# sao lưu các tệp khác loại trừ tar -cvzf" $ BACKUPDIR / $ BKUPFILE "- bao gồm '. *' - một hệ thống tập tin" $ SRCDIR "
bjackfly

không hiển thị dưới dạng mã trong các nhận xét nhưng bạn có ý tưởng
bjackfly

1

Sử dụng tìm toán tử logic -and-orđể chọn tất cả các tệp và thư mục không bắt đầu bằng '.':

tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system $(find /home/bjackfly -type f -or -type d -and -not -name '.*' )

Chỉnh sửa slhck nhận xét giải pháp trên không xử lý tên tệp có chứa khoảng trắng. Đây là một giải pháp, có lẽ ai đó biết một kỹ thuật thanh lịch hơn?

find . -type f -or -type d -and -not -name '.*' >/tmp/tar.$$
tar -cvzf /media/bjackfly/bkup/bkup.gz --one-file-system /home/bjackfly -T /tmp/tar.$$
rm /tmp/tar.$$

Điều này không hoạt động nếu các tập tin có khoảng trắng trong tên của họ.
slhck

Phát hiện dường như bao gồm các thư mục dấu chấm khi chạy
bjackfly

Nó làm việc cho tôi ở đây và bây giờ
suspectus

0

Vì vậy, mẹo thực sự ở đây là tạo một tệp .tar thông thường và sau đó sử dụng một đường dẫn tìm vào một tar khác bằng cách sử dụng tùy chọn -u để thêm hoặc cập nhật .tar và sau đó chỉ cần nén nó sau đó. Cảm ơn Mogget, người đã có ý tưởng cơ bản.

#!/bin/bash
BKUPDIR="/media/bjackfly/backupDisk/bkup"
BKUPFILE=$(/bin/date +"%Y%m%d").bkup
SRCDIR=/home/bjackfly


tar -cvf "$BKUPDIR/${BKUPFILE}.tar" --exclude '.*'  --one-file-system "$SRCDIR"
find $SRCDIR -maxdepth 1 -mindepth 1 -type f -name '.*'  ! \( -name .Xauthority.* \) | tar -uvf "$BKUPDIR/$BKUPFILE.tar" -T -
gzip "$BKUPDIR/$BKUPFILE.tar"

0

Không phải như thế. Nếu bạn muốn sao lưu tất cả các tệp trong cấu trúc thư mục phẳng mà không cần đệ quy, hãy sử dụng:

tar cvf backupfile.tar -C /specify/dir --no-recursion '.*'

Thật không may, sao lưu tập tin này với các thư mục chấm. tin tốt là, nội dung thư mục sẽ không được sao lưu.

Mặt khác, nếu tên tệp không có ký tự dòng mới, bạn có thể sử dụng:

cd /some/dir
find ./ -minlevel 1 -maxlevel 1 -type f -name '.*'|tar cvf backupfile.tar -T - --no-recursion

tìm tùy chọn -T. với đối số '-' này nhận danh sách tệp từ stdin của mình. danh sách được tạo bởi lệnh find. Cách tiếp cận này tốt hơn bởi vì bạn không bị giới hạn bởi độ dài lệnh maxumum, như các ví dụ được đưa ra bởi người khác, ví dụ tar .... một cái gì đó $ (tìm) hoặc tìm ... | xargs ... tar .. một cái gì đó ... {} đặt danh sách tệp đầy đủ dưới dạng lệnh tar. điều này có thể tràn giới hạn kích thước lệnh.

tùy chọn - không có đệ quy trong trường hợp này chỉ để bảo mật. Nguyên nhân này, khi tar nhận được một số thư mục, tar không bước cho cấu trúc thư mục này. nó rất hữu ích khi kết hợp với tìm kiếm.

Trong phương pháp này, bạn có thể chạy lệnh (khô mà không cần tạo bản sao lưu) và bạn sẽ thấy những tập tin nào cần.


Lưu ý rằng bạn có thể sử dụng các tùy chọn -print0trên find--nulltrên tarđể cho phép dòng mới trong tên tập tin trong lệnh thứ hai.
Dan D.

0

1.
find ./target-dir -type d -name '.?*' -prune -o -print0 | tar --null --no-recursion -cvzf backup.tar.gz -T -

HOẶC LÀ

2.
find ./target-dir -type d -name '.?*' -prune -o -print0 -exec tar --null --no-recursion -cvzf backup.tar.gz -T {} +

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.