List all directories and subdirectories, excluding directories without files

15,438

Solution 1

Here's one way: list all regular files, strip away the file basenames, and remove duplicates.

find . -type f | sed 's!/[^/]*$!!' | sort -u

If you want to strip the leading ./:

find . -type f | sed -e 's!/[^/]*$!!' -e 's!^\./!!' | sort -u

Solution 2

I consider installing tree:

  • sudo apt-get install tree

and then run

  • tree -d /path/to/start/dir

to display directories only.

Example:

root@X100e:~# tree -d /var/cache/
/var/cache/
├── apache2
│   └── mod_disk_cache
├── apt
│   └── archives
│       └── partial
├── binfmts
├── cups
│   └── rss
├── debconf
├── dictionaries-common
├── flashplugin-installer
...
Share:
15,438

Related videos on Youtube

ftiaronsem
Author by

ftiaronsem

Updated on September 17, 2022

Comments

  • ftiaronsem
    ftiaronsem almost 2 years

    I would like to list all the directories and sub directories in and below the current path. Since I only wanted to display directories I came up with the following command:

    find -type d -exec ls -d1 {} \; | cut -c 3-
    

    This prints out for example

    webphone
    music
    finance
    finance/banking
    finance/realestate
    finance/trading
    finance/other
    finance/moneylending
    finance/insurance
    webradio
    webtv
    

    The problem I have right now is, that the directory finance is listed. finance contains no files, just the sub directories you see above. What I want to achieve is the following output:

    webphone
    music
    finance/banking
    finance/realestate
    finance/trading
    finance/other
    finance/moneylending
    finance/insurance
    webradio
    webtv
    

    In this list the directory finance is not listed. Therefore I need your advice of how to filter directories which contain no files (only subdirectories).

    • phuclv
      phuclv over 4 years
      why are you using find -type d -exec ls -d1 {} \; instead of ls -d1 */?
  • ftiaronsem
    ftiaronsem over 13 years
    Thank you so much! Your reg-exp search was nearly perfect. I just had to strip the "./" and to remove the first emtpy line. The command I run now is: find . -type f | sed 's!/[^/]*$!!' | sort -u | sed '1d' | cut -c 3-
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' over 13 years
    @ftiaronsem: the empty line corresponds to the current directory. See my edit.
  • Scott - Слава Україні
    Scott - Слава Україні over 4 years
    But this will show directories that have subdirectories but don’t contain any files — and the OP wants these to be treated as empty.  Also, please don’t teach people to use -not without at least mentioning the original (and POSIX-compliant) “not” operator, namely !.