How to list just directories ( the correct way)

September 21st, 2007 mysurface Posted in Common, ls | Hits: 81973 | 19 Comments »

I have wrote a post stated that there are no direct ways to list just directories, and wrote a bash scripts using find to list the directories. I had made a WRONG statement. We can list just directories with ls -d, thanks to Ntropia who leaves me a comment.

Before that I had tried hard to use ls -d to list just directories but failed, therefore I wrote a bash script uses find to do that. It seems Ntropia provided a better solution and it is straight to the point, so let just treat the previous post as examples of find command.

The simplest way of list just directories

ls -d */ 

You can list the directories start with letter b

ls -d b*/ 

Further more list the subdirectories of the directories start with letter b

ls -d b*/*/ 

The outcome will be look like this


backup/10-5-2007/  backup/lunatic/              bin/gdc/
backup/ccbe/       backup/wplbe/                bt/王力宏 - 改变自己/
backup/full/       bin/ffmpeg-0.4.9-p20051216/

Bare in mind the command lines above do not list out the hidden directories, to list hidden directories

ls -d .*/

Yes, you can also list with details, and with nice colors.

ls -d .*/ -l

Manual of ls should at lease gives a line of example on how to list just directories, ls capable of doing that but it seems to like easter egg for me.

Updates
In fact, I had done the post of list just directories long time ago, :P

19 Responses to “How to list just directories ( the correct way)”

  1. [...] The statement above is WRONG, check out the simple way to list just directories with ls -d [...]

  2. This is useful!

  3. ls is a very powerful command, but in its simplest forms it really seems counterintuitive. For example:

    ls
    As you would expect it, lists the current directory contents.

    ls *
    Lists the contents of all the subdirectories of the current directory (?)

    ls -a
    The same as ls, but including hidden contents.

    ls -d
    ls -ad
    Just a dot! Hardly useful.

    ls -d *
    ls -ad *
    The man page says “-d list directory entries instead of contents [...]“. But this just gives the same as ls. The -a switch *does not* include hidden contents.

    ls -d */
    ls -ad */
    Just the directories, but not the hidden ones. The man and info pages don’t mention the slash trick, so I don’t know how is one supposed to learn it.

    I could go on and on. One of the reasons I use mc for file management is the complexity of ls and find. Maybe the dir command should have been for a simpler, user-friendly version of ls instead of an alias.

  4. [...] 这篇文章里面还提到了更多关于ls的技巧,特别是后面的用户留言里面有人发了一个用法的总结上面,有兴趣的可以跟过去看看。 [...]

  5. Is there a way to list just the files?

  6. To list files, we could list by just the file extensions.

  7. find * -prune -type d
    This list directories whithout the ending slash (the correct way)

  8. find * -prune -type f
    And just for the files… ;)

  9. walk directory tree in a script:

    base=$(pwd)
    for folder in $(find * -type d)
    do
    cd $folder
    # insert your code here
    cd $base
    done

  10. SO good the job your are. Thank for the tips and tricks

  11. Another way to list only directories or only files is to use ls and egrep together

    to list only directories
    ls | egrep ‘^d’

    to list only files
    ls | egrep -v ‘^d’

    note the -v inverts the selection, so the opposite of the first command is returned.

  12. # Recursively list directories.
    shopt -s globstar
    ls -d **/

  13. I agree with Salazar. The ls man page fails on this matter.

  14. # list only directory names in “location”:
    find “$location” -mindepth 1 -maxdepth 1 -type d -printf ‘%f’

  15. find “$address” -maxdepth 1 -type d -printf ‘%f\n’ | tail -n+2 | sort

    The find command’s -type d option lists the directories, the -printf ‘%f\n’ restricts output to just the filenames minus their paths and puts each entry on its own line. Piping through tail -n+2 gets rid of the first line which is always the name of the directory being examined. Piping through sort organises them sensibly.

    Hard to believe such a simple thing is missing from the basic linux toolset.

    There is the GNU ‘dir’ command. Using its -d option lists just directories, however there is no simple way to do it without their paths, other than piping through sed:
    dir -d “$address/*” | sed ‘s/.*\/\(.*\)/\1/g’
    Unfortunately the ‘/*’ is needed at the end of the address being queried.

  16. Oops… the ‘dir’ command doesn’t work quite as expected. It needs one final ‘/’ on the command so that it matches directories only, otherwise it prints out all files, directories or not, regardless of the ‘-d’ switch. I should have written:
    dir -d “$address/*/”
    Also, the sed command I gave won’t work either because the output of the dir listing ends with slashes. If you want just the directory names without the final slashes then you’d have to lop the trailing slash with perhaps sed:
    sed ‘s/\(.*\).$/\1/g’
    then get rid of the paths, perhaps with sed again:
    sed ‘s/.*\/\(.*\)/\1/g’
    But this is starting to become quite ridiculous:
    dir -d “$address/*/” | sed ‘s/\(.*\).$/\1/g’ | sed ‘s/.*\/\(.*\)/\1/g’

    Wouldn’t it be so much easier if linux had a simple option for ls to list directories?

    My old Amiga can do it easily. Even crappy old MSDOS can. I’m amazed that linux can’t.

  17. Thanks for the great information…… Chris

  18. Its such as you read my mind! You appear to grasp a lot approximately this, such as you wrote the e book in
    it or something. I believe that you just could do with
    a few p.c. to pressure the message home a little bit, but instead of that, this
    is excellent blog. An excellent read. I’ll definitely be back.

Leave a Reply