Answers:
试试这个(不确定这是否是最好的方法,但是可以用):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
它的工作方式如下:
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
不需要使用管道sort
,awk可以完成所有操作:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
命令引号将整个单行括起来,但是命令本身已经在find命令中使用了引号。要解决此问题,我将使用bash
的原义字符串语法如下:alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
在'find'命令的末尾添加并重新运行测试。
递归版本:
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
我基于此论坛帖子,信誉应该放在那儿。
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
电源外壳:
dir -recurse | select-object extension -unique
感谢http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
.
(例如,jquery-1.3.4
将.4
在输出中显示)。更改为dir -file -recurse | select-object extension -unique
仅获取文件扩展名。
我的无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
uniq
没有完整的标志--count
,但-c
效果很好
用点找到所有内容,仅显示后缀。
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
如果您知道所有后缀都有3个字符,则
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
或带有sed的所有后缀都显示一到四个字符。将{1,4}更改为后缀中期望的字符范围。
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
在混合中添加我自己的变体。我认为这是最简单的方法,当效率不是一个大问题时,它可能会很有用。
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
在Python中,使用生成器来处理非常大的目录(包括空白扩展名),并获取每个扩展名出现的次数:
import json
import collections
import itertools
import os
root = '/home/andres'
files = itertools.chain.from_iterable((
files for _,_,files in os.walk(root)
))
counter = collections.Counter(
(os.path.splitext(file_)[1] for file_ in files)
)
print json.dumps(counter, indent=2)
我在这里尝试了很多答案,甚至是“最佳”答案。他们都没有达到我的要求。因此,除了过去12个小时坐在多个程序的正则表达式代码中并阅读和测试这些答案之外,这也是我想到的,其工作原理与我想要的完全一样。
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
如果您需要计算文件扩展名,请使用以下代码
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
尽管这些方法需要一些时间才能完成,并且可能不是解决问题的最佳方法,但它们确实有效。
更新:每个@ alpha_989长文件扩展名将导致问题。这是由于原始正则表达式“ [[:::]] {3,6}”。我已经将答案更新为包括正则表达式“ [[:alpha:]] {2,16}”。但是,使用此代码的任何人都应该注意,这些数字是最终输出允许扩展多长时间的最小值和最大值。超出此范围的任何内容都将在输出中分成多行。
注意:原始文章确实显示为“-表示3到6个字符之间的文件扩展名(如果不符合您的需要,请调整数字)。这有助于避免缓存文件和系统文件(系统文件位是在监狱中搜索)。 ”
想法:可用于通过以下方式查找特定长度的文件扩展名:
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
其中4是要包括的文件扩展名长度,然后查找超出该长度的任何扩展名。
到目前为止,没有一个答复正确地使用换行符来处理文件名(除了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
我认为还没有提到这一点:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
接受的答案使用REGEX,并且您无法使用REGEX创建别名命令,必须将其放入外壳脚本中,我使用的是Amazon Linux 2,并执行以下操作:
我使用以下命令将接受的答案代码放入文件中:
须藤vim find.sh
添加此代码:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
通过输入以下内容保存文件: :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
),请使用find . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
来源