Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Because of specifics of my archiving needs I am not comfortable with solid tar.gz archives and use 7z instead.

I use the following command to do this:

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

To create an archive of everything inside ~/my/folder/ as the ~/my/folder.7z file.

But ~/my/folder/.hiddenFolder doesm't get into the archive then. How to fix this? Isn't * supposed to return all the files and folders?

share|improve this question
You are using bash path expansion by last *, try removing it, 7z should archive the whole directory. – enzotib Nov 2 '11 at 22:44
@enzotib but I don't want the directory in the archive, only what's inside it. And that's why I tagged the question for bash - maybe I am using "bash path expansion" a wrong way? – Ivan Nov 2 '11 at 22:51
up vote 6 down vote accepted

If you want the contents of a single directory, an easy method is to change to it first:

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

What you saw is that * expands to the list of names of files that don't begin with a .. That's the documented behavior, and it's the main reason why files whose name begins with a . are said to be hidden (the other is that ls doesn't show them by default).

There's no really convenient portable way to list all files in a directory. You can use

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

but if there is no file matching one of the patterns then the pattern will remain unexpanded. In bash, you can set the dotglob option to avoid treating a leading . specially (. and .. are still excluded from the matches):

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

In ksh, or in bash if you set the extglob option (or in zsh if you set the ksh_glob option), you can write a pattern that matches all files except . and ..:

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

In zsh, there's a simpler way of saying that . must not be treated specially in a pattern:

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

No, * is not supposed to return all files. It returns only visible ones.

The easier solution is:

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

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.