List directories only with ls

Posted in Linux/Unix/BSD -

The ls command is used to list directory contents when using the bash shell (and other shells), and has a variety of flags to choose what to display and how to format. This post shows how to list just the directories using ls.

Use the -d flag

Let's say we have the following directory at /tmp/test with three files and three directories:

$ ls -l
drwxr-xr-x 2 chris 1000 4096 Oct 13 09:55 1
-rw-r--r-- 1 chris 1000    0 Oct 13 09:55 1.txt
drwxr-xr-x 2 chris 1000 4096 Oct 13 09:55 2
-rw-r--r-- 1 chris 1000    0 Oct 13 09:55 2.txt
drwxr-xr-x 2 chris 1000 4096 Oct 13 09:55 3
-rw-r--r-- 1 chris 1000    0 Oct 13 09:55 3.txt

 Doing ls -ld /tmp/test will only show /tmp/test:

$ ls -ld /tmp/test
drwxr-xr-x 5 chris 1000 4096 Oct 13 09:55 /tmp/test

Adding /*/ to the end of the directory will then show the subdirectories:

$ ls -ld /tmp/test/*/
drwxr-xr-x 2 chris 1000 4096 Oct 13 09:55 /tmp/test/1/
drwxr-xr-x 2 chris 1000 4096 Oct 13 09:55 /tmp/test/2/
drwxr-xr-x 2 chris 1000 4096 Oct 13 09:55 /tmp/test/3/

If you leave the trailing slash off, then it will show the files as well as directories. To just show the subdirectories of the current directory instead of passing a full path, query */ like so:

$ ls -ld */
drwxr-xr-x 2 chris 1000 4096 Oct 13 09:55 1/
drwxr-xr-x 2 chris 1000 4096 Oct 13 09:55 2/
drwxr-xr-x 2 chris 1000 4096 Oct 13 09:55 3/

Note that I've used the -l flag in the above examples to show the file information, but you can also do it without, e.g.: ls -d */

On a Mac

The above example output was done on Debian Linux; I've noticed on my Mac there's an extra trailing slash at the end in the directory list:

ls -ld */
drwxr-xr-x  2 chris  wheel  68 13 Oct 10:01 1//
drwxr-xr-x  2 chris  wheel  68 13 Oct 10:01 2//
drwxr-xr-x  2 chris  wheel  68 13 Oct 10:01 3//

Unfortunately this seems unavoidable, because doing "ls -ld *" will show the files too. Another possibility to not show the trailing slash, if it bothers you, is to pipe an ls -l result through grep. This will be slower if it's a large directory:

ls -l | grep ^d
drwxr-xr-x  2 chris  wheel  68 13 Oct 10:01 1/
drwxr-xr-x  2 chris  wheel  68 13 Oct 10:01 2/
drwxr-xr-x  2 chris  wheel  68 13 Oct 10:01 3/

Other suggestions

If you have any other suggestions, please leave them in the comments below.



Related posts:


Comments