【发布时间】:2011-06-27 06:21:27
【问题描述】:
我可以使用什么命令或命令集合来返回目录(包括子目录)中的所有文件扩展名?
目前,我正在使用 ls 和 grep 的不同组合,但找不到任何可扩展的解决方案。
【问题讨论】:
我可以使用什么命令或命令集合来返回目录(包括子目录)中的所有文件扩展名?
目前,我正在使用 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。
【讨论】:
如果您使用的是 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#*.} 打印扩展的每个部分。
另一个使用 find 的解决方案(甚至应该正确地对嵌入换行符的文件扩展名进行排序):
# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
printf "%s\000" "${@##*.}"
' argv0 '{}' + |
sort -uz |
tr '\0' '\n'
【讨论】:
另外一个:
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。你确定你的方法是好的吗?
ls -1 | sed 's/.*\.//' | sort -u
更新: 你是对的,马修。根据您的评论,以下是更新版本:
ls -R1 | egrep -C 0 "[^\.]+\.[^\./:]+$" | sed 's/.*\.//' | sort -u
【讨论】:
ls,尤其是当它没用的时候。
ls -R1 | rg -C 0 "[^\.]+\.[^\./:]+$" | sed 's/.*\.//' | sort -u 对于大型文件夹,我得到至少 10 倍的改进。跨度>
当我在谷歌搜索一个好的答案时,我很快就尝试了这个。我比 Bash 更倾向于正则表达式,但这也适用于子目录。我也不认为包含没有扩展名的文件:
ls -R | egrep '(\.\w+)$' -o | sort | uniq -c | sort -r
【讨论】:
ls,尤其是当它没用的时候。
另一个,与其他类似,但只使用两个程序(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]++ 在第一次遇到扩展时评估为真,每次遇到扩展时评估为假。
print $NF 打印扩展名。
【讨论】: