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
...
Related videos on Youtube
Author by
ftiaronsem
Updated on September 17, 2022Comments
-
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 over 4 yearswhy are you using
find -type d -exec ls -d1 {} \;
instead ofls -d1 */
?
-
-
ftiaronsem over 13 yearsThank 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' over 13 years@ftiaronsem: the empty line corresponds to the current directory. See my edit.
-
Scott - Слава Україні over 4 yearsBut 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!
.