# Zip All Files Into Each Individual Zip File

The solution is pretty easy. If you want to do this for every file, recursively, use `find`. It will list all files and directories, descending into subdirectories too.

#### All Subdirectories:

```bash
find . -type f -execdir zip '{}.zip' '{}' \;
```

Explanation:

- The first argument is the directory you want to begin in, `.`
- Then we will restrict it to find files only (`-type f`)
- The `-execdir` option allows us to run a command on each file found, executing it from the file's directory
- This command is evaluated as `zip file.txt.zip file.txt`, for example, since all occurrences of `{}` are replaced with the actual file name. This command needs to be ended with `\;`

---

Of course, `find` has more options. If instead you just want to stay in your current directory, not descending into subdirectories:

#### Current Directory Only:

```bash
find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;
```

If you want to restrict it to certain file types, use the `-name` option (or `-iname` for case-insensitive matching):

#### Restrict To Specific Filetypes:

```bash
find . -type f -name "*.txt" …
```

Anything else (including looping with `for` over the output of `ls *`) is pretty ugly syntax in my opinion and likely to break, e.g. on files with spaces in their name or due to too many arguments.