HowTo: Linux / UNIX List Just Directories Or Directory Names

by Vivek Gite on September 28, 2006 · 33 comments

How do I list just directory names under Linux and UNIX operating systems?

Under Linux or UNIX use the ls command to list files and directories. However, ls does not have an option to list only directories. You can use combination of ls and grep to list directory names only.

Display or list all directories

Type the following command:
$ ls -l | egrep `^d'

Display or list only files

Type the following command:
$ ls -l | egrep -v `^d'

grep command used to searches input. It will filter out directories name by matching first character d. To reverse effect (just to display files) you need to pass -v option. It invert the sense of matching, to select non-matching lines.

Task: Create aliases to save time

You can create two aliases as follows to list only directories and files.
alias lf="ls -l | egrep -v '^d'"
alias ldir="ls -l | egrep '^d'"

Put above two aliases in your bash shell startup file:
$ cd
$ vi .bash_profile

Append two lines:
alias lf="ls -l | egrep -v '^d'"
alias ldir="ls -l | egrep '^d'"

Save and close the file.

Now just type lf - to list files and ldir - to list directories only:
$ cd /etc
$ lf

Output:

-rw-r--r--   1 root root      2149 2006-09-04 23:25 adduser.conf
-rw-r--r--   1 root root        44 2006-09-29 05:11 adjtime
-rw-r--r--   1 root root       197 2006-09-04 23:48 aliases
-rw-------   1 root root       144 2002-01-18 13:43 at.deny
-rw-r--r--   1 root root       162 2006-09-22 23:24 aumixrc
-rw-r--r--   1 root root        28 2006-09-22 23:24 aumixrc1
....
..
....

List directory names only:
$ cd /etc
$ ldir
Output:

drwxr-xr-x   4 root root      4096 2006-09-22 16:41 alsa
drwxr-xr-x   2 root root      4096 2006-09-20 20:59 alternatives
drwxr-xr-x   6 root root      4096 2006-09-22 16:41 apm
drwxr-xr-x   3 root root      4096 2006-09-07 02:51 apt
drwxr-xr-x   2 root root      4096 2006-09-08 01:46 bash_completion.d
....
.....
.

find command

The find command can be used as follows to list all directories in /nas, enter:

find /nas -type d
find /nas -type d -ls
find . -type d -ls

Sample outputs:

1070785    8 drwxrwxrwt   8 root     root         4096 Jul  5 07:12 .
1070797    8 drwx------   2 root     root         4096 Jul  4 07:22 ./orbit-root
1070843    8 drwxr-xr-x   2 root     root         4096 Jun 16 18:55 ./w
1070789    8 drwxr-xr-x  10 root     root         4096 Jun 17 14:54 ./b
1071340    8 drwxr-xr-x   2 root     root         4096 Jun 16 18:55 ./b/init.d
1071581    8 drwxr-xr-x   3 root     root         4096 Jun 16 18:55 ./b/bind
1071584    8 drwxr-xr-x   2 root     root         4096 Jun 16 18:55 ./b/bind/bak
1071617    8 drwxr-xr-x   2 root     root         4096 Jun 16 18:55 ./b/fw
1071628    8 drwxr-xr-x   8 root     root         4096 Jun 16 18:55 ./b/scripts

Featured Articles:

Share this with other sys admins!
Facebook it - Tweet it - Print it -

{ 33 comments… read them below or add one }

1 Eric April 26, 2007

To get just file names without the long list data:

ls -l | grep ‘^d’ | awk ‘{ print $9 }’

Or

for foo in *; do if [ -d $foo ]; then print -n ” $foo”; else false; fi; done

Reply

2 Lingerance September 18, 2007

find . -type d -maxdepth 1

Reply

3 mysurface September 21, 2007

ls -d */

or for hidden directories
ls -d .*/

Reply

4 vivek September 21, 2007

Thanks for contributing all other tips :)

Reply

5 Vinayak September 26, 2007

Thanks a lot for nice recipe… :-)

Reply

6 Michel Roig October 1, 2007

To get just the subdirectories names

find . -type d -maxdepth 1 -exec basename {} \;

However, in this case you also get the directory itself! To avoid this, add mindepth 1:

find . -type d -maxdepth 1 -mindepth 1 -exec basename {} \;

Reply

7 Eugenio November 18, 2007

For some reasons on FAT fs

ls -d */

is not working. But this works on any filesystem:

ls -d ./*/

Reply

8 Suresh M January 4, 2008

echo */

Reply

9 Al January 11, 2009

mysurface — you are the man!

Reply

10 biodafes January 21, 2009

(folders)
ls -F | grep /
(files)
ls -F | grep -v /

Reply

11 Mahantesh Biradar January 30, 2009

Lists all the subdirectories in the current directory..

ls -R | grep ./

Reply

12 Gareth Reeman May 1, 2009

can some1 please help me i need to know what the significant effects are of the following characters in unix filenames. 2 dots / 1 dot / tilde or “squiggle”
..
.
~

Reply

13 Vivek Gite May 1, 2009

. Current directory
.. Parent directory
~ Your home directory

Reply

14 Dennis Quek May 5, 2009

Can you just list the directories name, without the permission, datetime, and etc … ?

Reply

15 kopla May 8, 2009

Thanx, nice post. I was just thinking of doing it with awk but couldnt get the wildcard working. Now I am one step ahead in my shell knowledge ^^
To Dennis Quek above :
A rather dirty solution but does the job.

ls -l | egrep ‘^d’ | awk ‘$1=” “‘ | awk ‘$1=” “‘ | awk ‘$1=” “‘ | awk ‘$1=” “‘ | awk ‘$1=” “‘ | awk ‘$1=” “‘| awk ‘$1=” “‘| awk ‘$1=” “‘

(forgive me if seeing this code gives someone a heart attack, all i can say is that I’m still learning :P )
I would love if someone can give my code a neater look :)

Reply

16 Ashish June 20, 2011

A cleaner Recipe for the same using AWK :

ls -l | egrep ‘^d’ | awk ‘{ print $9}’

another alternate is bit clumsy :

ls -l | egrep ‘^d’ | awk ‘$1=” “,$2=” “‘ | awk ‘$1=” “,$2=” “‘ | awk ‘$1=” “,$2=” “‘ | awk ‘$1=” “,$2=” “‘

Another Simpler and Faster way out to get the Desired result :

ls -l|grep ‘^d’

Reply

17 kopla May 8, 2009

oops! didnt read the other comments. Already many nice solutions have been posted :P

Reply

18 jagan June 30, 2009

i used to the $ du command to retrieve all directory names.
$ du

Reply

19 Aditya July 28, 2009

> i used to the $ du command to retrieve all directory names.
Jagan,
du is used to calculate Disk Usage. I want to know did you tweak this command to display directory listing in pwd. Please explain.

Reply

20 anon October 7, 2009

$ /bin/ls -l | grep “^d” | cut -d’ ‘ -f8
it’s a neat trick on linux systems.

i’m using /bin/ls and not ls because it may be aliased

Reply

21 Amit Nagwanshi October 20, 2009

one can list directory i simple and easy way by :
1. ls -ltr | grep -e d
2. ls -ld */
3. du

third one is the most easiest way. :-)

Reply

22 Amr October 23, 2009

I tried with both GNU ls and BSD one and the best option is as someone else posted above:

ls -ld */

Reply

23 Mohammed asif December 9, 2009

i renamed a directory name with a space in between the directory name within GUI(Graphical User Interface)
which is allowed and now in the shell prompt i.e. in the terminal command mode i want to enter the directory which has a space in between but it does not allows to enter into that directory it says “INVALID DIRECTORY”
is their any alternative solution or trick to enter into the directory with the name having space.please explain
the directory name is “file data”
i tried with — $cd file data but it didnt work out.

Reply

24 Sirdude February 25, 2010

nice stuff!

i learned a lot from the original post, but the comments are a treasure trove!

one thing about the original post, you have a back tick instead of a single quote in the 1st two snippets
ls -l | egrep `^d’ for example should be ls -l | egrep ‘^d’ for the copy / pasters

thanks again ;)

Reply

25 newbee1 March 3, 2010

if you wanted to pull a date from the directory to only list files from datea/timea through dateb/timeb (say March 2 at 6:00 AM to March 8 at 6:00 AM) and move into a new file the output, how is this accomplished? I tried this but no output
#!/bin/bash
FILES=’ls -A1′
OUTFILE=”c:/temp/RRDfilesinrange.txt”
STARTDATE=’date –utc –date “2010-02-27 06:00:00″ %s’
ENDDATE=’date –utc –date “2010-03-02 06:00:00″ %s’
cd C: temp/tsfr-complete
for f in $FILES
do
if [ -f $f ]; then
FDATE=’stat -c “%Z” $f’
if [ $FDATE -ge $STARTDATE ]; then
if [ $FDATE -le $ENDDATE ]; then
‘echo $f >> $OUTFILE’
fi
fi
fi
done

Reply

26 Davis April 27, 2010

How do you get the directory listing to display only: the file name, the user that owns the file and that user’s permissions?

Reply

27 balarajangeetha August 4, 2010

//Mohammed asif December 9, 2009
is their any alternative solution or trick to enter into the directory with the name having space.please explain//
did you try
cd “file data”
or
cd ‘file data’
( i.e. directory name with double quotes or single quote)
you yourself have given the hint :-)

Reply

28 danio August 23, 2010

@Davis:
ls -l | awk ‘{ print $1,$3,$9 }’

Reply

29 Volomike October 8, 2010


alias ldir="ls -d -1 */ | tr -d '/'"
ldir

Reply

30 dccrowley February 15, 2011

works :)) Thanks

Reply

31 alireza October 21, 2010

Hello.
I would like to do some batching in my linux but I couldn’t find any way of initializing an array containing folder’s location information. In short, I have data in two folders located at:
/home/alireza/Desktop/DTIBetula101019/B2509.30
/home/alireza/Desktop/DTIBetula101019/B2509.50

and I want to make an array following by a loop to do some specific command inside each folder seprately like this:

fn_list= (‘/home/alireza/Desktop/DTIBetula101019/B2509.30′,’/home/alireza/Desktop/DTIBetula101019/B2509.50′)

for fn in ${fn_list}
do
cd $fn
fsl4.1-fslmerge -t big4D 2501.45-DTI1-s007 2501.45-DTI2-s008 2501.45-DTI3-s009
done

can anybody help me to figure out how to specify an array that can pointed to a folder which can be reused during a for loop?

Thanks
/Alireza

Reply

32 asl.marc January 6, 2011

alias lsdir=’ls -d ./*/ | cut -d / -f 2′

lsdir

for i in `lsdir` ; do du -ks $i; done

Reply

33 SilversleevesX September 21, 2011

Commenting on Eric’s ls | grep | awk combination:
Cygwin (1.7.9) displays 8, not 9, fields in

    ls -l

.

So change his “awk ‘{print 9}’” to awk ‘{print 8}’ and you’ll get more than a bunch of deadspace in mintty.

Just in case it wasn’t already obvious. *S*

BZT

Reply

Leave a Comment

You can use these HTML tags and attributes for your code and commands: <strong> <em> <ol> <li> <u> <ul> <blockquote> <pre> <a href="" title="">




Previous post:

Next post: