Counting files in a Linux directory is done with the `ls -1 | wc -l` command. If you’ve ever wondered how to find number of files in a directory linux, you’re in the right place. This guide covers multiple methods, from simple commands to advanced techniques, so you can pick the one that fits your needs. We’ll keep things practical and easy to follow, with examples you can try right away.
How To Find Number Of Files In A Directory Linux
The most common way to count files is using the `ls` command piped to `wc -l`. But there are other options depending on what you need—like counting only files, excluding directories, or handling hidden files. Let’s break it down step by step.
Using Ls And Wc For A Quick Count
Open your terminal and navigate to the directory you want to check. Run this command:
ls -1 | wc -l
The `-1` flag lists one file per line. The pipe sends that list to `wc -l`, which counts the lines. This gives you the total number of items, including files and subdirectories.
For example, if your directory has 15 files and 3 folders, the output will be 18. That’s fine for a quick estimate, but not if you need just files.
Counting Only Files With Find
If you want to count only regular files (not directories), use `find`:
find . -maxdepth 1 -type f | wc -l
Here, `-maxdepth 1` limits the search to the current directory only. The `-type f` flag filters for files. This command excludes subdirectories, hidden files, and symlinks by default.
You can also count files recursively—meaning all files in subfolders—by removing the `-maxdepth` option:
find . -type f | wc -l
This counts every file under the current directory, which is useful for large projects.
Including Hidden Files In The Count
Hidden files (those starting with a dot) are not shown by default in `ls`. To include them, use the `-A` flag:
ls -1A | wc -l
The `-A` lists all entries except `.` and `..`. For hidden files only, combine `ls -1A` with `grep` to filter:
ls -1A | grep '^\.' | wc -l
This counts only hidden files, which is handy for checking configuration files.
Counting Files By Extension
Need to count only `.txt` or `.jpg` files? Use `find` with a pattern:
find . -maxdepth 1 -type f -name "*.txt" | wc -l
Replace `*.txt` with any extension. You can also use `ls` with wildcards:
ls -1 *.txt 2>/dev/null | wc -l
The `2>/dev/null` suppresses error messages if no files match. This method works but is less reliable than `find`.
Counting Files And Directories Separately
To see both counts, use `ls` with the `-l` flag and parse the output:
ls -l | grep -c '^-'
This counts files only (lines starting with `-`). For directories:
ls -l | grep -c '^d'
Or use `find` for more precision:
echo "Files: $(find . -maxdepth 1 -type f | wc -l)"
echo "Dirs: $(find . -maxdepth 1 -type d | wc -l)"
Using Tree For A Visual Count
The `tree` command shows a directory structure and a summary at the end. Install it if needed:
sudo apt install tree # Debian/Ubuntu
sudo yum install tree # RHEL/CentOS
Then run:
tree -a
The output includes a line like “5 directories, 12 files”. The `-a` flag includes hidden files. This is great for a quick overview.
Counting Files In Multiple Directories
To count files across several directories at once, use a loop:
for dir in /path/to/dir1 /path/to/dir2; do
echo "$dir: $(find "$dir" -maxdepth 1 -type f | wc -l)"
done
Or use `find` with `-exec`:
find /path/to/parent -maxdepth 1 -type d -exec sh -c 'echo "$1: $(find "$1" -maxdepth 1 -type f | wc -l)"' _ {} \;
This counts files in each subdirectory of a parent folder.
Handling Large Directories Efficiently
For directories with thousands of files, `ls` can be slow. Use `find` with `-printf` for speed:
find . -maxdepth 1 -type f -printf '.' | wc -c
This prints a dot for each file and counts characters. It’s faster because it avoids sorting. For recursive counts:
find . -type f -printf '.' | wc -c
Counting Files With Specific Permissions
To count files with certain permissions (e.g., executable):
find . -maxdepth 1 -type f -executable | wc -l
Or use `-perm` for exact permissions:
find . -maxdepth 1 -type f -perm 755 | wc -l
Using Stat For A Quick Count
The `stat` command can show file counts for the current directory:
stat -c '%h' .
But this counts hard links, not files. It’s not reliable for counting files. Stick with `ls` or `find`.
Counting Files With A Script
For repeated tasks, create a simple script. Save this as `countfiles.sh`:
#!/bin/bash
echo "Files: $(find "$1" -maxdepth 1 -type f | wc -l)"
echo "Dirs: $(find "$1" -maxdepth 1 -type d | wc -l)"
echo "Total: $(ls -1 "$1" | wc -l)"
Make it executable and run:
chmod +x countfiles.sh
./countfiles.sh /path/to/dir
Common Mistakes To Avoid
- Using `ls -l | wc -l` counts the total lines, including the “total” line at the top. Subtract 1 or use `grep`.
- Forgetting hidden files—use `-A` or `-a` if needed.
- Counting symlinks as files—use `-type f` in `find` to exclude them.
- Not handling spaces in filenames—`find` handles them safely, but `ls` might break.
Comparing Methods
| Method | Counts Files Only? | Includes Hidden? | Recursive? | Speed |
|---|---|---|---|---|
| ls -1 | wc -l | No | No | No | Fast |
| find -type f | wc -l | Yes | Yes | Yes | Moderate |
| ls -1A | wc -l | No | Yes | No | Fast |
| tree -a | Yes | Yes | Yes | Slow |
Practical Examples
Check your home directory:
find ~ -maxdepth 1 -type f | wc -l
Count all Python files in a project:
find /path/to/project -type f -name "*.py" | wc -l
See how many files are in each subfolder:
for d in */; do echo "$d: $(find "$d" -maxdepth 1 -type f | wc -l)"; done
Automating With Cron
To log file counts daily, add a cron job:
0 2 * * * find /var/log -type f | wc -l >> /tmp/filecount.log
This counts files in `/var/log` every night at 2 AM.
Why Counting Files Matters
Knowing file counts helps with disk space management, backup planning, and performance tuning. For example, too many files in a single directory can slow down `ls` and other commands. Monitoring counts can alert you to issues.
Advanced: Counting With Awk
For complex needs, use `awk`:
ls -l | awk '/^-/{count++} END{print count}'
This counts files only. You can modify the pattern to count directories or symlinks.
Counting Files By Size
To count files larger than 1MB:
find . -type f -size +1M | wc -l
Or smaller than 1KB:
find . -type f -size -1k | wc -l
Counting Files By Date
Files modified in the last 7 days:
find . -type f -mtime -7 | wc -l
Files accessed today:
find . -type f -atime 0 | wc -l
Using Bash Builtins
For a pure bash solution (no external commands):
count=0
for f in *; do
[ -f "$f" ] && ((count++))
done
echo $count
This is slower but works without `find` or `ls`.
Counting Inodes
Each file uses an inode. To see total inodes:
df -i
This shows used and available inodes per filesystem. Running out of inodes can cause “No space left on device” errors even if disk space is available.
Handling Symlinks
By default, `find -type f` excludes symlinks. To include them:
find . -type l | wc -l
Or count both files and symlinks:
find . \( -type f -o -type l \) | wc -l
Counting Empty Files
Files with zero size:
find . -type f -empty | wc -l
Counting Files With Specific Owners
Files owned by user “john”:
find . -type f -user john | wc -l
Using Ncdu For Interactive Browsing
The `ncdu` tool shows disk usage and file counts interactively. Install it and run:
ncdu /path/to/dir
It’s not a direct count command, but it gives a visual overview.
Counting Files In Compressed Archives
To count files inside a tar archive:
tar -tf archive.tar | wc -l
For a zip file:
unzip -l archive.zip | tail -1 | awk '{print $2}'
Common Pitfalls With Large Directories
If you have millions of files, `ls` can hang. Use `find` with `-maxdepth` and avoid sorting. The `-printf` trick with dots is fastest.
Summary Of Commands
- Quick count: `ls -1 | wc -l`
- Files only: `find . -maxdepth 1 -type f | wc -l`
- Recursive: `find . -type f | wc -l`
- Hidden included: `ls -1A | wc -l`
- By extension: `find . -name “*.txt” -type f | wc -l`
- Visual: `tree -a`
Frequently Asked Questions
How Do I Count Files In A Directory Including Subdirectories?
Use `find . -type f | wc -l` to count all files recursively. This includes files in every subfolder.
What Command Counts Only Regular Files, Not Directories?
Run `find . -maxdepth 1 -type f | wc -l` to count only files in the current directory. Remove `-maxdepth 1` for recursive counting.
Why Does `Ls -L | Wc -L` Give One Extra Line?
The `ls -l` output includes a “total” line at the top. Subtract 1 from the count or use `ls -1 | wc -l` instead.
Can I Count Hidden Files With `Ls`?
Yes, use `ls -1A | wc -l` to include hidden files (except `.` and `..`). The `-A` flag shows all entries.
How To Count Files By Extension Like .Pdf Or .Jpg?
Use `find . -type f -name “*.pdf” | wc -l`. Replace `*.pdf` with your desired extension.
This guide covers everything you need to count files in Linux directories. Start with the simple `ls` command, then explore `find` for more control. Practice with different options to see what works best for your tasks. Remember to check for hidden files and handle large directories carefully. With these tools, you’ll never wonder how to find number of files in a directory linux again.