Trích xuất (các) tệp vào ổ cứng từ `archive-mode`


7

Tôi đang tìm kiếm một phương tiện để trích xuất các tệp riêng lẻ được đánh dấu từ kho lưu trữ (ví dụ: * .zip; * .gz, v.v.) vào ổ cứng (không mở chúng trong bộ đệm) bằng cách sử dụng archive-mode. Một sửa đổi được đề xuất của chế độ chính đó (sẽ cho phép tính năng mới này) sẽ được đánh giá rất cao.

http://www.gnu.org/software/emacs/manual/html_node/emacs/File-Archives.html

Câu trả lời:


7

Đây là một bản phác thảo của một thực hiện.

Chế độ lưu trữ lưu trữ bản đồ từ các kiểu lưu trữ đến các lệnh được sử dụng để trích xuất dữ liệu theo các biến archive-TYPE-extract; chúng ta có thể tìm đúng biến bằng cách sử dụng (archive-name "extract").

Tất cả các lệnh được thiết kế để trích xuất ra tiêu chuẩn; may mắn thay, chúng ta vẫn có thể sử dụng chúng nếu chúng ta chuyển hướng stdoutđến một tệp mà chúng ta chọn.

(defun archive-extract-to-file (archive-name item-name command dir)
  "Extract ITEM-NAME from ARCHIVE-NAME using COMMAND. Save to
DIR."
  (unwind-protect
      ;; remove the leading / from the file name to force
      ;; expand-file-name to interpret its path as relative to dir
      (let* ((file-name (if (string-match "\\`/" item-name)
                            (substring item-name 1)
                          item-name))
             (output-file (expand-file-name file-name dir))
             (output-dir (file-name-directory output-file)))
        ;; create the output directory (and its parents) if it does
        ;; not exist yet
        (unless (file-directory-p output-dir)
          (make-directory output-dir t))
        ;; execute COMMAND, redirecting output to output-file
        (apply #'call-process
               (car command)            ;program
               nil                      ;infile
               `(:file ,output-file)    ;destination
               nil                      ;display
               (append (cdr command) (list archive-name item-name))))
    ;; FIXME: add unwind forms
    nil))

Tôi sửa đổi archive-extract-by-fileđể có được điều này.

(defun archive-extract-marked-to-file (output-dir)
  "Extract marked archive items to OUTPUT-DIR."
  (interactive "sOutput directory: ")
  (let ((command (symbol-value (archive-name "extract")))
        (archive (buffer-file-name))
        (items (archive-get-marked ?* t))) ; get marked items; t means
                                           ; get item under point if
                                           ; nothing is marked
    (mapc
     (lambda (item)
       (archive-extract-to-file archive
                                (aref item 0) ; get the name from the descriptor
                                command output-dir))
     items)))

Ở đây tôi sử dụng mapcđể lặp qua tất cả các tệp được đánh dấu và giải nén chúng.

Bây giờ chúng ta chỉ cần thêm một ràng buộc chính:

(require 'arc-mode)
(define-key archive-mode-map "F" #'archive-extract-marked-to-file)

Tôi đã thử nghiệm điều này trên một .ziptệp giả có chứa thư mục con, nhưng số dặm của bạn có thể thay đổi.

Lưu ý rằng archive-modesự ủng hộ Arc, Lzh, Zip, Zoo, Rar, và 7z. Nó không hỗ trợ .tgz, .tbz, .tar.gzvà bạn bè, mà được mở ra sử dụng tar-modeuncompress.el.


@lawlist: Vui lòng xem câu trả lời cập nhật; bây giờ nó có thể trích xuất các tập tin có trong thư mục con. Lưu ý rằng nó tạo lại cấu trúc thư mục: foo/bar.txttrong một kho lưu trữ được trích xuất output-dir/foo/bar.txt, không phải output-dir/bar.txt. Điều thứ hai là có thể, tất nhiên, nhưng sẽ yêu cầu thêm một số mã.
Constantine

Nó thật là tuyệt. Một khi bạn cảm thấy tự tin với nó, bạn có cân nhắc việc thêm nó vào chế độ lưu trữ không?
Malabarba

@Malabarba: Vâng, tôi sẽ. Tôi đang chờ hồi âm từ copyright-clerk@fsf.org(tôi đã nhận được e-mail này từ Lars Ingebrigtsen ) ngay bây giờ; trong lúc này tôi sẽ dọn dẹp cái này và đưa nó lên GitHub.
Constantine

Tính năng mới này thật tuyệt vời! Cảm ơn bạn rất nhiều - đánh giá rất cao! Đây thực sự sẽ là một bổ sung tuyệt vời cho chế độ lưu trữ. Như bạn đã lưu ý, khả năng nhắm mục tiêu một thư mục đầu ra cụ thể mà không nhất thiết phải tạo lại cấu trúc thư mục zip-archive (trong thư mục đầu ra) sẽ tiện dụng. Như vậy, nó chắc chắn xứng đáng với một dấu kiểm + cho câu trả lời đúng :)
luật

Cảm ơn rất nhiều cho mã này! Mặc dù vậy, một điều: sẽ tốt hơn (interactive "G...")theo cách này, nó sẽ đề xuất thư mục hiện tại, cộng với nó sẽ tự động hoàn tất và tương tác với chế độ Ido, v.v.
wvxvw 10/03/2015
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.