Làm cách nào để sử dụng 7z để lưu trữ tất cả các tệp và thư mục (bao gồm cả các tệp ẩn) trong một thư mục?


10

Do đặc thù của nhu cầu lưu trữ của tôi, tôi không thoải mái với kho lưu trữ tar.gz vững chắc và sử dụng 7z thay thế.

Tôi sử dụng lệnh sau để làm điều này:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*

Để tạo một kho lưu trữ của tất cả mọi thứ bên trong ~/my/folder/như ~/my/folder.7ztập tin.

Nhưng ~/my/folder/.hiddenFoldersau đó không được vào kho lưu trữ. Làm thế nào để khắc phục điều này? Không phải *trả lại tất cả các tập tin và thư mục?


Bạn đang sử dụng mở rộng đường dẫn bash cuối cùng *, hãy thử gỡ bỏ nó, 7z nên lưu trữ toàn bộ thư mục.
enzotib

@enzotib nhưng tôi không muốn thư mục trong kho lưu trữ, chỉ có những gì bên trong nó. Và đó là lý do tại sao tôi gắn thẻ câu hỏi cho bash- có thể tôi đang sử dụng "bash path mở rộng" một cách sai?
Ivan

Câu trả lời:


8

Nếu bạn muốn nội dung của một thư mục, một phương pháp dễ dàng là thay đổi nó trước:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .

Những gì bạn thấy là *mở rộng ra danh sách tên của các tệp không bắt đầu bằng a .. Đó là hành vi được ghi lại và đó là lý do chính tại sao các tệp có tên bắt đầu bằng một .được cho là bị ẩn (cái khác là lskhông hiển thị chúng theo mặc định).

Không có cách di động thực sự thuận tiện để liệt kê tất cả các tệp trong một thư mục. Bạn có thể dùng

~/my/folder/..?* ~/my/folder/.[!.]* ~/my/folder/*

nhưng nếu không có tệp nào khớp với một trong các mẫu thì mẫu sẽ vẫn chưa được mở rộng. Trong bash, bạn có thể đặt dotglobtùy chọn để tránh đối xử .đặc biệt hàng đầu ( ...vẫn bị loại khỏi các trận đấu):

shopt -s dotglob
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*

Trong ksh hoặc trong bash nếu bạn đặt extglobtùy chọn (hoặc trong zsh nếu bạn đặt ksh_globtùy chọn), bạn có thể viết một mẫu phù hợp với tất cả các tệp ngoại trừ ...:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/@(..?*|.[!.]*|*)

Trong zsh, có một cách nói đơn giản hơn mà .không được đối xử đặc biệt theo một mẫu:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*(D)

9

TL; DR

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/.

Thêm ví dụ

Cấu trúc thư mục ví dụ

test1
├── .hidden
└── normal.txt

0 directories, 2 files

Hãy thử các lệnh sau

  1. Thư mục gốc với tất cả nội dung của nó.

    7za a test1_a.7z ~/test1/

    cho

        Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51 D....            0            0  test1
    2017-08-06 09:23:44 ....A            0            0  test1/.hidden
    2017-08-06 09:23:51 ....A            0            0  test1/normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  2 files, 1 folders
    
  2. Không có thư mục gốc và không có tập tin ẩn

    7za a test1_b.7z ~/test1/*

    cho

       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51 ....A            0            0  normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  1 files
    
  3. Không có thư mục gốc nhưng các tệp ẩn được bao gồm (đó là những gì chúng ta thường muốn)

    7za a test1_c.7z ~/test1/.

    cho

       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:44 ....A            0            0  .hidden
    2017-08-06 09:23:51 ....A            0            0  normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  2 files
    

Có, chỉ cần thử nghiệm điều này và nó gọn gàng hơn nhiều so với việc sử dụng shopt.
sẽ

Câu trả lời tốt nhất ở đây. Cảm ơn bạn.
Marcin

4

Không, *không có nghĩa vụ phải trả lại tất cả các tập tin. Nó chỉ trả về những cái có thể nhìn thấy.

Giải pháp dễ dàng hơn là:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .
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.