Glo*_*ish 218 linux filesystems grep file-extension
在Linux机器上,我想遍历文件夹层次结构并获取其中所有不同文件扩展名的列表.
从shell实现这一目标的最佳方法是什么?
Iva*_*uev 323
试试这个(不确定它是否是最好的方法,但它有效):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
Run Code Online (Sandbox Code Playgroud)
它的工作原理如下:
Sie*_*geX 48
不需要管道sort,awk可以做到这一切:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
Run Code Online (Sandbox Code Playgroud)
Chr*_*heD 36
递归版:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Run Code Online (Sandbox Code Playgroud)
如果你想要总数(看到扩展的时间有多少):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
Run Code Online (Sandbox Code Playgroud)
非递归(单个文件夹):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
Run Code Online (Sandbox Code Playgroud)
我基于这个论坛帖子,信用应该去那里.
小智 24
电源外壳:
dir -recurse | select-object extension -unique
Run Code Online (Sandbox Code Playgroud)
感谢http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
小智 12
使用点查找everythin并仅显示后缀.
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
Run Code Online (Sandbox Code Playgroud)
如果你知道所有后缀都有3个字符
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
Run Code Online (Sandbox Code Playgroud)
或者使用sed显示所有带有一到四个字符的后缀.将{1,4}更改为后缀中您期望的字符范围.
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
Run Code Online (Sandbox Code Playgroud)
添加我自己的变化混合.我认为这是最简单的,当效率不是一个大问题时可能很有用.
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
Run Code Online (Sandbox Code Playgroud)
我的无awk,无sed,无Perl,无Python的POSIX兼容替代方案:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
Run Code Online (Sandbox Code Playgroud)
诀窍是,它会反转行并在开始处剪切扩展名。
还将扩展名转换为小写。
输出示例:
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
Run Code Online (Sandbox Code Playgroud)
在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)
Run Code Online (Sandbox Code Playgroud)
我在这里尝试了一堆答案,甚至是"最好"的答案.他们都没有达到我特别追求的目标.因此,除了过去12个小时的多个程序的正则表达式代码以及阅读和测试这些答案之外,这就是我想出来的,它正如我想要的那样正常工作.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
Run Code Online (Sandbox Code Playgroud)
如果您需要文件扩展名的计数,请使用以下代码
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
Run Code Online (Sandbox Code Playgroud)
虽然这些方法需要一些时间才能完成,而且可能不是解决问题的最佳方法,但它们可以正常工作.
更新:每@ alpha_989长文件扩展名将导致问题.这是由于原始的正则表达式"[[:alpha:]] {3,6}".我更新了答案,包括正则表达式"[[:alpha:]] {2,16}".但是,使用此代码的任何人都应该知道这些数字是最终输出允许扩展的最小值和最大值.超出该范围的任何内容都将在输出中分成多行.
注意:原帖显示为" - 文件扩展名为3到6个字符的Greps(如果它们不符合您的需要,只需调整数字).这有助于避免缓存文件和系统文件(系统文件位是搜索jail). "
想法:可用于通过以下方式查找特定长度的文件扩展名:
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
Run Code Online (Sandbox Code Playgroud)
其中4是要包含的文件扩展名长度,然后查找超出该长度的任何扩展名.
| 归档时间: |
|
| 查看次数: |
100126 次 |
| 最近记录: |