How do I uncompress/unzip within Emacs
Solution 1
You've got options...
To uncompress a .zip file, you just need to add to the variable 'dired-compress-file-suffixes
(eval-after-load "dired-aux"
'(add-to-list 'dired-compress-file-suffixes
'("\\.zip\\'" ".zip" "unzip")))
Now the Z
key in dired will recognize the .zip extension and uncompress a .zip archive. Already supported are gunzip
, bunzip2
, uncompress
and dictunzip
.
If you want to mark files and add them to a .zip archive you can use the following to make z
bound to zip the set of marked files:
(eval-after-load "dired"
'(define-key dired-mode-map "z" 'dired-zip-files))
(defun dired-zip-files (zip-file)
"Create an archive containing the marked files."
(interactive "sEnter name of zip file: ")
;; create the zip file
(let ((zip-file (if (string-match ".zip$" zip-file) zip-file (concat zip-file ".zip"))))
(shell-command
(concat "zip "
zip-file
" "
(concat-string-list
(mapcar
'(lambda (filename)
(file-name-nondirectory filename))
(dired-get-marked-files))))))
(revert-buffer)
;; remove the mark on all the files "*" to " "
;; (dired-change-marks 42 ?\040)
;; mark zip file
;; (dired-mark-files-regexp (filename-to-regexp zip-file))
)
(defun concat-string-list (list)
"Return a string which is a concatenation of all elements of the list separated by spaces"
(mapconcat '(lambda (obj) (format "%s" obj)) list " "))
Solution 2
To zip files, open the directory in dired. Mark the files you want to zip with m
. Then type
! zip foo.zip * <RET>
To extract an entire archive from dired you can mark a file and run & unzip
, just as you would in a shell.
zip-archive mode will allow you to browse zip files in a dired-like fashion. It should come with recent versions of GNU emacs and will be used by default when you visit a file with the .zip extension. From this mode you can extract individual files into a buffer, and from there save them with C-x C-s
.

Damien Cassou
I am currently working as software developer at Företagsplatsen.
Updated on April 15, 2022Comments
-
Damien Cassou 27 days
I would like to run unzip (or even zip) within dired or a dired-like buffer. Is there anything like this? I would like something similar as in the Nautilus file manager: i.e., selecting files and then pressing a keystroke to get these files into a new archive file.
Thank you
-
hatmatrix over 12 yearsdoesn't 'Z' do it out-of-the-box? (or mark it with 'm' and then hit 'Z'). I recall it worked for me a while back. I saw it here: xahlee.org/emacs/file_management.html
-
Trey Jackson over 12 years
Z
will compress the files, each of them individually. It doesn't add them to an archive/zip. -
Damien Cassou over 12 yearsIt seems concat-string-list does not exist: concat: Symbol's function definition is void: concat-string-list
-
Damien Cassou over 12 yearsOk, I've implemented it: (defun concat-string-list (list) "Return a string which is a concatenation of all elements of the list separated by spaces" (mapconcat '(lambda (obj) (format "%s" obj)) list " "))
-
Trey Jackson over 12 yearsSorry about that, I forgot I had that in my own helper functions, I'll add it to the answer code.
-
Damien Cassou over 12 yearsit also seems that 'dired-compress-file-suffixes is defined by dired-aux and not by dired itself. Which makes the eval-after-load not working. I changed "dired" by "dired-aux" and it now works ok.
-
monotux about 11 yearsI think the above code needs some escaping for filenames, try marking a few files like
2010_12_HEAD_Seminar (1).pdf
and see what happens. -
Admin about 5 yearsIn Emacs 25, you can use
string-join
fromsubr-x
instead ofconcat-string-list
. -
Ajned over 1 yearI am experiencing the same as @monotux. Is there a way to compress files that have spaces in between names? Annoyingly several people tend to use spaces instead of underscores or dashes. Thank you in advance.