Skip to main content
2 of 8
added 530 characters in body
John1024
  • 76.4k
  • 12
  • 176
  • 165
find . -type f -name '*f*' | sed -r 's|/[^/]+$||' |sort |uniq 

The above finds all files below the current directory (.) that are regular files (-type f) and have f somewhere in their name (-type "*f*"). Next, sed removes the file name, leaving just the directory name. Then, the list of directories is sorted (sort) and duplicates removed (uniq).

The sed command consists of a single substitute. It looks for matches to the regular expression /[^/]+$ and replaces anything matching that with nothing. The dollar sign means the end of the line. [^/]+' means one or more characters that are not slashes. Thus, /[^/]+$` means all characters from the final slash to the end of the line. In other words, this matches the file name at the end of the full path. Thus, the sed command removes the file name, leaving unchanged the name of directory that the file was in.

John1024
  • 76.4k
  • 12
  • 176
  • 165