我正在寻找文件的扩展名,如果文件没有扩展名,cut 只是给出文件名,所以我希望让 cut 在没有“。”时给出“无扩展名”。发现我用这个作为参考:https : //stackoverflow.com/questions/1842254/how-can-i-find-all-of-the-distinct-file-extensions-in-a-folder-hierarchy忽略没有扩展名的文件的答案不好,因为我也需要找到那些
我正在寻找文件的扩展名,如果文件没有扩展名,cut 只是给出文件名,所以我希望让 cut 在没有“。”时给出“无扩展名”。发现我用这个作为参考:https : //stackoverflow.com/questions/1842254/how-can-i-find-all-of-the-distinct-file-extensions-in-a-folder-hierarchy忽略没有扩展名的文件的答案不好,因为我也需要找到那些
在
zsh
外壳中:这会在每一行打印当前目录中或下的所有常规文件的所有扩展名。在对其进行排序和计数之前,空扩展名将替换为使用文本
EXTENSIONLESS
。sed
匹配路径名中的
**
glob (“递归”),就像在该shell 中设置 shell 选项时的相同模式。zsh
/
bash
globstar
(.:e)
模式末尾的 是一个通配符,它使前面的模式只匹配常规文件,并从每个匹配的名称 ( )(.)
中删除除扩展名之外的所有内容。:e
dummy.EXTENSIONLESS
同样的事情,但是使用表达式在 globbing 表达式中替换无扩展名的文件名e['...']
,因此摆脱了sed
调用:在非
zsh
shell 中,您可以使用find
内联 shell 脚本来执行上述管道的前几部分:这用于
find
查找当前目录中或下方的所有常规文件。对于这些文件的批次,它调用一个内嵌的 shell 脚本。该脚本遍历当前路径名集并将每个路径名的文件名部分提取到变量name
中。然后它测试是否$name
包含一个点,后跟至少一个其他字符。如果名称中有一个点(后面跟着一些东西),则打印点后面的部分;EXTENTSIONLESS
否则,打印字符串。find
然后以与之前相同的方式对的输出进行排序和计数。请注意,上面的代码将调用类似
hello.
extension-less 的名称,而.bashrc
将具有扩展名bashrc
. 将模式更改*.?*
为*?.?*
在点的任一侧都需要一个字符(将.bashrc
计为无扩展名)。