列出目录中包含的文件的所有唯一扩展名


11

我想查看某个目录中包含的文件的所有唯一扩展名。在bash中执行此命令的命令是什么?

可以find . -type f用来获取当前目录中的所有文件,然后剥离扩展名并将其通过管道传输到uniq。剥离扩展的最简单方法是什么?

Answers:


15

尝试这个:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

它不输出任何内容:

  • 没有扩展名的文件
  • 名称以点结尾的文件
  • 隐藏文件

将其通过管道传输到可能也很有用sort | uniq -c


不适用于Mac上的默认sed。我得到sed: illegal option -- r
dzhelil 2011年

8
@celil:使用-E的,而不是-r在OS X
暂停,直至另行通知。

3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

在OS X上可用,但不带扩展名的文件除外。我的下载文件夹:

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

您可能需要sed -r代替吗?


次要问题:不带扩展名的文件将打印其名称。隐藏的文件(例如.DS_Store)会打印其名称而不加前导.


我建议sort -u不要使用sort | uniq。减少分叉和资源使用。
约翰T

谢谢@约翰。试图保持celil的“框架”不变,所以我没有想到。
丹尼尔·贝克

不必在其中转义一个点[]
暂停,直到另行通知。

3

这是又一个解决方案,它不会因包含嵌入式换行符的文件名而引起混淆,并用于sort -uz正确排序可能也包含嵌入式换行符的文件扩展名:

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl

3

删除扩展名的一种快速简便的方法是,假设所有文件名的格式均为“ name.ext”,然后使用:

 ls -1 | cut -d"." -f2- | sort | uniq -c

这样就可以算出有多少个唯一的扩展名,例如:

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  

1

瞧,这就是为什么我喜欢awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.