I recently encountered some odd behavior with the unzip command while trying to extract multiple .zip files from a folder to another folder. I thought I could use a wildcard pattern like this: unzip /path/to/file/*.zip. However, instead of extracting the files, I got "caution: filename not matched" for each of my archives. After some digging, I found out that adding an escape character worked: unzip /path/to/file/*.zip, which successfully unzipped everything as I intended. This left me puzzled, though. I always thought that escape characters negate the effect of wildcards and treat the asterisk as a regular character. Why did the second command work when it felt like it shouldn't? I'm using Pop OS if that helps with context.
4 Answers
This behavior is pretty common across many command-line tools, but unzip is one where it's particularly evident. It can get confusing, especially if you're switching between different shell environments. Just remember, if you want to keep the wildcard as is, escape it or quote it!
Exactly, once you grasp that distinction, using these commands becomes a lot smoother!
With the first command where you saw that caution message, the shell had matched the wildcard to your .zip files and passed those names to unzip. Since they weren't found in the zip archives, unzip complained. It’s essential to understand how wildcards are expanded in different contexts!
You can also use quotes around the wildcard to prevent shell expansion like this: unzip "*.zip". The quotes keep it intact and prevent the shell from trying to replace it with matching files right away. It's fascinating that unzip behaves this way compared to other commands.
True, there are a few commands that do this. The find command works similarly, using -name option with wildcard patterns. It's useful to know these quirks!
Yep! This wildcard handling is unique, but handy in scripts and command-line operations.
When you run the command with the wildcard, like unzip /path/to/file/*.zip, the shell expands the wildcard before passing it to the unzip command. So if you have three .zip files, it translates to something like unzip /path/to/file/file1.zip /path/to/file/file2.zip /path/to/file/file3.zip. However, when you use the escape character as in unzip /path/to/file/*.zip, the shell does not expand the wildcard. Instead, unzip receives exactly what you typed, interpreting the asterisk as a wildcard itself. This is why it worked in the second case, with unzip extracting files matched within each archive.
Ah, I see! The lightbulb just went on for me. Thanks for clarifying that!
Exactly! I had a similar realization when trying to untangle nested directories with .zip files. A little script saved my day!

I’ve made that mistake many times. Thanks for helping clear this up!