我可以使用哪些命令或命令集合来返回目录(包括子目录)中的所有文件扩展名?
目前,我正在使用ls
和grep
的不同组合,但我找不到任何可扩展的解决方案。
答案 0 :(得分:57)
这个怎么样:
find . -type f -name '*.*' | sed 's|.*\.||' | sort -u
答案 1 :(得分:3)
find . -type f | sed 's|.*\.||' | sort -u
也适用于mac。
答案 2 :(得分:1)
列出所有扩展及其当前和所有子目录的计数
ls -1R | sed 's/[^\.]*//' | sed 's/.*\.//' | sort | uniq -c
答案 3 :(得分:0)
如果您使用的是Bash 4 +
shopt -s globstar
for file in **/*.*
do
echo "${file##*.}
done
红宝石(1.9 +)
ruby -e 'Dir["**/*.*"].each{|x|puts x.split(".")[-1]}' | sort -u
答案 4 :(得分:0)
使用find的另一种解决方案(甚至应该正确排序带有嵌入换行符的文件扩展名):
# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
printf "%s\000" "${@##*.}"
' argv0 '{}' + |
sort -uz |
tr '\0' '\n'
答案 5 :(得分:0)
Boooom另一个:
find * | awk -F . {'print $2'} | sort -u
答案 6 :(得分:0)
ls -1 | sed 's/.*\.//' | sort -u
更新: 你是对的Matthew。根据您的评论,这是一个更新版本:
ls -R1 | egrep -C 0 "[^\.]+\.[^\./:]+$" | sed 's/.*\.//' | sort -u
答案 7 :(得分:0)
我正在快速尝试这个,因为我正在谷歌搜索一个很好的答案。我比Bash更倾向于正则表达式,但这也适用于子目录。我不认为包含没有扩展名的文件:
ls -R | egrep '(\.\w+)$' -o | sort | uniq -c | sort -r
答案 8 :(得分:0)
另一个,与其他类似,但仅使用两个程序(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
打印扩展名。