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.