我该使用什么命令或命令集合来返回一个目录中(包括子目录)的所有文件扩展名?
目前,我正在使用不同的 ls
和 grep
组合,但我找不到可扩展的解决方案。
find . -type f -name '*.*' | sed 's|.*\.||' | sort -u
列出当前目录和所有子目录中的所有扩展名及其数量
ls -1R | sed 's/[^\.]*//' | sed 's/.*\.//' | sort | uniq -c
find . -type f | sed 's|.*\.||' | sort -u
同样适用于Mac操作系统。
这是另一种方法,类似于其他方法,但只使用两个程序(find和awk)
find ./ -type f -name "*\.*" -printf "%f\n" | awk -F . '!seen[$NF]++ {print $NF}'
-type f
限制只查找文件,不包括目录。
-name "*\.*"
确保文件名中有一个 .
。
-printf "%f\n"
只打印文件名,不包括路径。
-F .
让awk将句点作为字段分隔符。
$NF
是最后一个字段,由句点分隔。
!seen[$NF]++
在第一次遇到扩展名时计算为true,在每次遇到扩展名时都计算为false。
print $NF
打印扩展名。
如果您正在使用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
MSYS2
,模式 "${file##*.}"
只会打印带有两个点的扩展名的最后部分(例如当扩展名为 .tar.gz
时,它只会打印 .gz
)。模式 "${file#*.}
打印扩展名的每个部分。 - Alex Hall使用find的另一种解决方案(甚至可以正确地排序带有嵌入式换行符的文件扩展名):
# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
printf "%s\000" "${@##*.}"
' argv0 '{}' + |
sort -uz |
tr '\0' '\n'
我只是在谷歌搜索好答案时很快地尝试了一下。我更倾向于正则表达式而不是Bash,但这也适用于子目录。我不认为它包括没有扩展名的文件:
ls -R | egrep '(\.\w+)$' -o | sort | uniq -c | sort -r
ls
的输出,尤其是当它没有用处时。 - gniourf_gniourf又来了一个:
find * | awk -F . {'print $2'} | sort -u
echo 'gniourf.tar.gz' | awk -F . {'print $2'}
返回 tar
,而 echo 'one.two.three.pdf' | awk -F . {'print $2'}
返回 two
。您确定您的方法是正确的吗? - gniourf_gniourfls -1 | sed 's/.*\.//' | sort -u
ls
的输出,尤其是当它没有用处时。 - gniourf_gniourf
.ctags
,这通常不是你想要的。 - DevSolar