在Linux机器上,我希望遍历一个文件夹层次结构,并获得其中所有不同文件扩展名的列表。
从外壳中实现这一点的最佳方法是什么?
在Linux机器上,我希望遍历一个文件夹层次结构,并获得其中所有不同文件扩展名的列表。
从外壳中实现这一点的最佳方法是什么?
当前回答
Powershell:
dir -recurse | select-object extension -unique
感谢http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
其他回答
试试这个(不确定是不是最好的方法,但确实有效):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
它的工作原理如下:
找到当前文件夹中的所有文件 打印文件扩展名(如果有的话) 制作一个唯一的排序列表
因为已经有了另一个使用Perl的解决方案:
如果你安装了Python,你还可以这样做(从shell):
python -c "import os;e=set();[[e.add(os.path.splitext(f)[-1]) for f in fn]for _,_,fn in os.walk('/home')];print '\n'.join(e)"
另一种方法:
找到。-type f -name "*。*" -printf "%f\n" | while if = read -r;执行“${REPLY##*.}”;完成|排序-u
您可以删除名称“*”。*”,但这确保我们只处理具有某种扩展名的文件。
printf是find的print,不是bash的。-printf "%f\n"只打印文件名,剥离路径(并添加换行符)。
然后使用字符串替换,使用${REPLY##*.}删除到最后一个点。
注意$REPLY只是read的内置变量。我们可以用我们自己的形式:while IFS= read -r file,这里$file是变量。
到目前为止,没有一个回复正确地处理带有换行符的文件名(除了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
我认为最简单直接的方法是
for f in *.*; do echo "${f##*.}"; done | sort -u
它是根据克里斯托夫的第三种方法改进的。