如何从目录中递归查找所有文件扩展名?

时间:2011-02-14 22:58:57

标签: bash terminal grep

我可以使用哪些命令或命令集合来返回目录(包括子目录)中的所有文件扩展名?

目前,我正在使用lsgrep的不同组合,但我找不到任何可扩展的解决方案。

9 个答案:

答案 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打印扩展名。