Listing only directories using ls in Bash?
Categories:
Listing Only Directories with ls
in Bash

Learn various methods to filter ls
output to display only directories, enhancing your command-line efficiency in Bash.
When working in the Bash command line, the ls
command is fundamental for listing files and directories. However, its default output can often be cluttered with files when you're only interested in navigating or managing directories. This article explores several effective techniques to use ls
(and related commands) to display only directories, making your terminal interactions cleaner and more focused.
Understanding the Challenge
The ls
command, by default, lists all entries in a given path – files, directories, and symbolic links. While options like -F
can append indicators (e.g., /
for directories, *
for executables), they don't filter the output. Our goal is to achieve a listing that exclusively shows directory names, similar to how you might browse a file system visually, but from the command line.
flowchart TD A[Start] --> B{"Need to list directories only?"} B -->|Yes| C{Choose Method} C --> D[Method 1: `ls -d */`] C --> E[Method 2: `find . -maxdepth 1 -type d`] C --> F[Method 3: `ls -l | grep "^d"`] D --> G[Review Output] E --> G F --> G G --> H[End]
Decision flow for listing directories in Bash
Method 1: Using ls -d */
This is often the simplest and most direct approach. The *
is a glob pattern that matches any file or directory. When followed by a /
, it specifically matches only directories. The -d
option to ls
tells it to list the directory entries themselves, rather than their contents.
ls -d */
Basic usage of ls -d */
to list directories.
*/
to a list of all directory names before ls
even sees the command. If there are no directories, the shell might pass */
literally to ls
, which would then report an error. To prevent this, you can set shopt -s nullglob
in Bash, which makes patterns that match nothing expand to nothing.Method 2: Using find
Command
The find
command is a powerful utility for locating files and directories based on various criteria. It offers more flexibility and robustness, especially in directories with many entries or complex naming conventions.
find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
Using find
to list directories in the current directory.
Let's break down the find
command options:
.
: Specifies the starting directory (current directory).-maxdepth 1
: Limits the search to the current directory only, preventingfind
from descending into subdirectories.-type d
: Filters the results to include only directories.-print0
: Prints the full file name on the standard output, followed by a null character. This is crucial for handling filenames with spaces or special characters.xargs -0 ls -d
:xargs
takes the null-terminated output fromfind
and passes it as arguments tols -d
. The-0
option ensuresxargs
correctly interprets the null-terminated input.
Method 3: Filtering ls -l
Output with grep
Another common approach involves using ls -l
(long listing format) and piping its output to grep
to filter for lines that start with 'd', which signifies a directory in the long listing output.
ls -l | grep "^d"
Filtering ls -l
output using grep
.
grep
might misinterpret, or if you have aliases that modify ls
output. For simple cases, it works, but ls -d */
or find
are generally more robust.Comparing the Methods
Each method has its strengths and weaknesses. Choosing the right one depends on your specific needs and the context of your script or command-line interaction.

Comparison of directory listing methods
For most interactive uses, ls -d */
is quick and easy. For scripting or when dealing with complex filenames, find
offers superior reliability and flexibility. The grep
method is a quick hack but less robust.