Extraer archivo (s) al disco duro del `modo de archivo '


Respuestas:


7

Aquí hay un boceto de una implementación.

El modo de archivo almacena mapas de tipos de archivo a comandos utilizados para extraer datos en variables archive-TYPE-extract; podemos encontrar la variable correcta usando (archive-name "extract").

Todos los comandos están diseñados para extraer a la salida estándar; Afortunadamente, aún podemos usarlos si redirigimos stdouta un archivo de nuestra elecció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))

Modifiqué archive-extract-by-filepara obtener esto.

(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)))

Aquí uso mapcpara recorrer todos los archivos marcados y extraerlos.

Ahora solo necesitamos agregar un enlace clave:

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

Probé esto en un .ziparchivo ficticio que contiene un subdirectorio, pero su kilometraje puede variar.

Tenga en cuenta que archive-modelos soportes Arc, Lzh, Zip, Zoo, Rar, y 7z. No , no admite .tgz, .tbz, .tar.gzy amigos, que se abren usando tar-modey uncompress.el.


@lawlist: consulte la respuesta actualizada; ahora debería poder extraer archivos contenidos en subdirectorios. Tenga en cuenta que recrea la estructura del directorio: foo/bar.txten un archivo se extrae a output-dir/foo/bar.txt, no a output-dir/bar.txt. Esto último es posible, por supuesto, pero requeriría más código.
— Constantino

Eso es muy agradable. Una vez que se sienta seguro con él, ¿consideraría agregarlo al modo de archivo?
— Malabarba

@Malabarba: Sí, lo haría. Estoy esperando una respuesta de copyright-clerk@fsf.org(recibí este correo electrónico de Lars Ingebrigtsen ) ahora mismo; Mientras tanto, limpiaré esto y lo pondré en GitHub.
— Constantine

¡Esta nueva característica es increíble! Muchas gracias, muy apreciado! De hecho, esta sería una maravillosa adición al modo de archivo. Como notó, sería útil la capacidad de apuntar a un directorio de salida específico sin necesariamente volver a crear la estructura del directorio de archivo comprimido (en el directorio de salida). Como es, sin duda es digno de una marca de verificación + para la respuesta correcta :)
— lawlist

¡Muchas gracias por este código! Sólo una cosa: que sería mejor que (interactive "G...")de esta manera se le sugerirá el directorio actual, además de que va a autocompletar e interactuar con el modo Ido etc.
— wvxvw
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.