在Linux机器上,我希望遍历一个文件夹层次结构,并获得其中所有不同文件扩展名的列表。
从外壳中实现这一点的最佳方法是什么?
在Linux机器上,我希望遍历一个文件夹层次结构,并获得其中所有不同文件扩展名的列表。
从外壳中实现这一点的最佳方法是什么?
当前回答
递归版本:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
如果你想要总数(有多少次扩展被看到):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
非递归(单个文件夹):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
我是根据这个论坛帖子写的,功劳应该在那里。
其他回答
我的无awk、无sed、无perl、无python的posix兼容替代方案:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
诀窍在于它将行反转,并在开始处切断扩展。 它还将扩展名转换为小写。
示例输出:
3689 jpg
1036 png
610 mp4
90 webm
90 mkv
57 mov
12 avi
10 txt
3 zip
2 ogv
1 xcf
1 trashinfo
1 sh
1 m4v
1 jpeg
1 ini
1 gqv
1 gcs
1 dv
找到每一个点,只显示后缀。
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
如果你知道所有后缀有3个字符,那么
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
或使用sed显示所有1到4个字符的后缀。将{1,4}更改为您希望在后缀中使用的字符范围。
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
我认为最简单直接的方法是
for f in *.*; do echo "${f##*.}"; done | sort -u
它是根据克里斯托夫的第三种方法改进的。
递归版本:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
如果你想要总数(有多少次扩展被看到):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
非递归(单个文件夹):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
我是根据这个论坛帖子写的,功劳应该在那里。
到目前为止,没有一个回复正确地处理带有换行符的文件名(除了ChristopheD的,它是在我输入这篇文章时出现的)。下面不是一个shell一行程序,但是可以工作,并且相当快。
import os, sys
def names(roots):
for root in roots:
for a, b, basenames in os.walk(root):
for basename in basenames:
yield basename
sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:]))
for suf in sufs:
if suf:
print suf