在 Linux 機器上,我想遍歷一個文件夾層次結構並獲取其中所有不同的文件擴展名列表。
從 shell 中實現這個任務的最佳方法是什麼?
在 Linux 機器上,我想遍歷一個文件夾層次結構並獲取其中所有不同的文件擴展名列表。
從 shell 中實現這個任務的最佳方法是什麼?
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
它的工作方式如下:
不需要使用管道来进行sort
,awk可以完成所有操作:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
- user2602152!a[] <<< awk:在源代码第1行处退出。我做错了什么?我的别名定义如下:alias file_ext="find . -type f -name '.' | awk -F. '!a[$NF]++{print $NF}'"
alias
命令的参数,但该命令本身已经在find
命令中使用了引号。为了解决这个问题,我建议使用bash
的字面字符串语法,如下所示:alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
。 - SiegeXmaindir/test.dir/myfile
,它会失败。 - Nelson Teixeirafind . -name '*.?*' -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
完全可以正常工作。 - worcfind . -type f -name '*.?* ....'
,没有完全测试,但应该可以工作。 - Ondra Žižkauniq
也缺少--count
参数,但它具有-c
选项。 - user1593842递归版本:
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
- vulcan ravenPowerShell:
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
只获取文件扩展名。 - mcw在这里,我加入了自己的变化。我认为这是最简单的方法,并且在效率不是一个大问题时很有用。
find . -type f | grep -oE '\.(\w+)$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
。 - mMontu$ find . -type f | grep -Eo '\.(\w+)$' | sort -u
。原本的正则表达式会显示没有扩展名的文件,在我的情况下那不是我需要的。 - Fernando Crespo查找所有带有点的内容,并仅显示后缀。
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
如果你知道所有的后缀都有三个字符,那么
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
我尝试了这里的很多答案,甚至是“最佳”答案,但它们都没有达到我特别想要的效果。因此,除了在多个程序的正则表达式代码中坐了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
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
在此处,“4”指要包括的文件扩展名长度,还要查找超出该长度的任何扩展名。
find . -type f -name "*.php" -exec stat -c "%s" {} + | awk '{s+=$1} END {print s}'
。 - anjanesh在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)
既然已经有了使用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)"
.svn
),请使用find . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
[来源] (https://dev59.com/43E95IYBdhLWcg3wbtXO#2314680) - Dennis Golomazovgit ls-tree -r HEAD --name-only
代替find
命令来获取git仓库中的文件列表。 - jakub.gfind . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
- marcovtwout