What command, or collection of commands, can I use to return all file extensions in a directory (including sub-directories)?
Right now, I'm using different combinations of ls
and grep
, but I can't find any scalable solution.
What command, or collection of commands, can I use to return all file extensions in a directory (including sub-directories)?
Right now, I'm using different combinations of ls
and grep
, but I can't find any scalable solution.
How about this:
find . -type f -name '*.*' | sed 's|.*\.||' | sort -u
find . -type f | sed 's|.*\.||' | sort -u
Also works on mac.
list all extensions and their counts of current and all sub-directories
ls -1R | sed 's/[^\.]*//' | sed 's/.*\.//' | sort | uniq -c
if you are using Bash 4+
shopt -s globstar
for file in **/*.*
do
echo "${file##*.}
done
Ruby(1.9+)
ruby -e 'Dir["**/*.*"].each{|x|puts x.split(".")[-1]}' | sort -u
Yet another solution using find (that should even sort file extensions with embedded newlines correctly):
# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
printf "%s\000" "${@##*.}"
' argv0 '{}' + |
sort -uz |
tr '\0' '\n'
Boooom another:
find * | awk -F . {'print $2'} | sort -u
ls -1 | sed 's/.*\.//' | sort -u
Update: You are correct Matthew. Based on your comment, here is an updated version:
ls -R1 | egrep -C 0 "[^\.]+\.[^\./:]+$" | sed 's/.*\.//' | sort -u
I was just quickly trying this as I was searching Google for a good answer. I am more Regex inclined than Bash, but this also works for subdirectories. I don't think includes files without extensions either:
ls -R | egrep '(\.\w+)$' -o | sort | uniq -c | sort -r