How to get the number of files in a folder as a variable?

bash, shell

Solution

The quotes are causing the error messages.

To get a count of files in the directory:

shopt -s nullglob
numfiles=(*)
numfiles=${#numfiles[@]}

which creates an array and then replaces it with the count of its elements. This will include files and directories, but not dotfiles or `.` or `..` or other dotted directories.

Use `nullglob` so an empty directory gives a count of 0 instead of 1.

You can instead use `find -type f` or you can count the directories and subtract:

# continuing from above
numdirs=(*/)
numdirs=${#numdirs[@]}
(( numfiles -= numdirs ))

Also see "How can I find the latest (newest, earliest, oldest) file in a directory?"

You can have as many spaces as you want inside an execution block. They often aid in readability. The only downside is that they make the file a little larger and may slow initial parsing (only) slightly. There are a few places that must have spaces (e.g. around `[`, `[[`, `]`, `]]` and `=` in comparisons) and a few that must not (e.g. around `=` in an assignment.

Problem

Using bash, how can one get the number of files in a folder, excluding directories from a shell script without the interpreter complaining? With the help of a friend, I've tried ``` $files=$(find ../ -maxdepth 1 -type f | sort -n) $num=$("ls -l" | "grep ^-" | "wc -l") ``` which returns from the command line: ``` ../1-prefix_blended_fused.jpg: No such file or directory ls -l : command not found grep ^-: command not found wc -l: command not found ``` respectively. These commands work on the command line, but NOT with a bash script. Given a file filled with image files formatted like `1-pano.jpg`, I want to grab all the images in the directory to get the largest numbered file to tack onto the next image being processed. Why the discrepancy?

Original source

Related problems