如何在文件夹层次结构中找到所有不同的文件扩展名?

2024-10-31 08:38:00
admin
原创
184
摘要:问题描述:在 Linux 机器上,我想要遍历文件夹层次结构并获取其中所有不同文件扩展名的列表。从 shell 中实现这一目标的最佳方法是什么?解决方案 1:试试这个(不确定这是否是最好的方法,但它有效):find . -type f | perl -ne 'print $1 if m/.([...

问题描述:

在 Linux 机器上,我想要遍历文件夹层次结构并获取其中所有不同文件扩展名的列表。

从 shell 中实现这一目标的最佳方法是什么?


解决方案 1:

试试这个(不确定这是否是最好的方法,但它有效):

find . -type f | perl -ne 'print $1 if m/.([^./]+)$/' | sort -u

其工作原理如下:

  • 查找当前文件夹中的所有文件

  • 打印文件扩展名(如果有)

  • 制作一个独特的排序列表

解决方案 2:

不需要管道sort,awk 可以完成所有工作:

find . -type f | awk -F. '!a[$NF]++{print $NF}'

解决方案 3:

我的无 awk、无 sed、无 Perl、无 Python 的 POSIX 兼容替代方案:

find . -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

解决方案 4:

递归版本:

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
" "${f##*.}"; done | sort -u

我根据这个论坛帖子得出了这个结论,功劳应该归于此。

解决方案 5:

Powershell:

dir -recurse | select-object extension -unique

感谢http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html

解决方案 6:

添加了我自己的变体。我认为这是所有变体中最简单的一种,当效率不是主要考虑因素时很有用。

find . -type f | grep -oE '.(w+)$' | sort -u

解决方案 7:

查找所有以点开头的字符并仅显示后缀。

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})$//p'| sort -u

解决方案 8:

我尝试了这里的很多答案,甚至是“最佳”答案。它们都没有达到我所追求的具体目标。所以,除了过去 12 个小时坐在多个程序的正则表达式代码中阅读和测试这些答案之外,这就是我想出的完全符合我要求的答案。

 find . -type f -name "*.*" | grep -o -E ".[^.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
  • 查找所有可能有扩展名的文件。

  • 仅 Greps 扩展

  • 查找 2 到 16 个字符之间的文件扩展名(如果不符合您的需要,只需调整数字)。这有助于避免缓存文件和系统文件(系统文件位用于搜索 jail)。

  • Awk 以小写形式打印扩展名。

  • 排序并仅引入唯一值。最初我曾尝试使用 awk 答案,但它会重复打印大小写敏感度不同的项目。

如果您需要计算文件扩展名的数量,请使用以下代码

find . -type f -name "*.*" | grep -o -E ".[^.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn

尽管这些方法需要一些时间才能完成,并且可能不是解决问题的最佳方法,但它们确实有效。

更新:根据@alpha_989,长文件扩展名会导致问题。这是由于原始正则表达式“[[:alpha:]]{3,6}”造成的。我已更新答案以包含正则表达式“[[:alpha:]]{2,16}”。但是,使用此代码的任何人都应该知道,这些数字是最终输出允许的扩展长度的最小值和最大值。超出该范围的任何内容都将在输出中分成多行。

注意:原始帖子确实写道“- 查找 3 到 6 个字符之间的文件扩展名(如果不符合您的需要,只需调整数字)。这有助于避免缓存文件和系统文件(系统文件位用于搜索 jail)。”

想法:可以通过以下方式查找超过特定长度的文件扩展名:

 find . -type f -name "*.*" | grep -o -E ".[^.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u

其中 4 是需要包含的文件扩展名的长度,然后还查找超出该长度的任何扩展名。

解决方案 9:

在 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)

解决方案 10:

由于已经有另一个使用 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 '
'.join(e)"

解决方案 11:

另一种方法:

`find . -type f -name "." -printf "%f
" | while IFS= read -r; do echo "${REPLY##*.}"; done | sort -u`

您可以删除-name "*.*",但这可确保我们只处理具有某种扩展名的文件。

-printfisfind的打印,而不是 bash。仅`-printf "%f
"`打印文件名,剥离路径(并添加换行符)。

然后我们使用字符串替换来删除最后一个点${REPLY##*.}

请注意,这$REPLY只是read的内置变量。我们也可以按照以下形式使用自己的变量:while IFS= read -r file,这里 $file 就是变量。

解决方案 12:

到目前为止,没有一个回复能够正确处理带换行符的文件名(除了 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

解决方案 13:

我认为最简单直接的方法是

for f in *.*; do echo "${f##*.}"; done | sort -u

它是根据 ChristopheD 的第 3 种方式修改的。

解决方案 14:

我认为还没有提到这一点:

find . -type f -exec sh -c 'echo "${0##*.}"' {} ; | sort | uniq -c

解决方案 15:

接受的答案使用 REGEX,并且您无法使用 REGEX 创建别名命令,您必须将其放入 shell 脚本中,我正在使用 Amazon Linux 2 并执行以下操作:

  1. 我将接受的答案代码放入文件中,使用方法如下:

sudo vim 查找命令

添加此代码:

find ./ -type f | perl -ne 'print $1 if m/.([^./]+)$/' | sort -u

输入以下命令保存文件: :wq!

  1. sudo vim ~/.bash_profile

  2. alias getext=". /path/to/your/find.sh"

  3. :wq!

  4. . ~/.bash_profile

解决方案 16:

你也可以这样做

find . -type f -name "*.php" -exec PATHTOAPP {} +

解决方案 17:

我发现它简单又快捷......

   # find . -type f -exec basename {} ; | awk -F"." '{print $NF}' > /tmp/outfile.txt
   # cat /tmp/outfile.txt | sort | uniq -c| sort -n > tmp/outfile_sorted.txt

解决方案 18:

如果您正在寻找这方面的答案.gitignore,请查看以下答案。

git ls-tree -r HEAD --name-only | perl -ne 'print $1 if m/.([^./]+)$/' | sort -u 

解决方案 19:

Ondra Žižka 的另一个版本:

find . -name '*.?*' -type f | rev | cut -d. -f1 | rev | sort | uniq

在区分大小写的文件系统中,我认为不同的大小写不应视为相同的扩展名。此外,我认为没有必要通过计算文件数量来回答 OP 的问题。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用