file - 获取文件扩展名的脚本

标签 file bash

我需要获取文件夹中的所有文件扩展名类型。例如,如果目录的 ls 给出以下内容:

a.t  
b.t.pg  
c.bin  
d.bin  
e.old  
f.txt  
g.txt  

我应该通过运行脚本来得到它

.t  
.t.pg  
.bin  
.old  
.txt  

我有一个 bash shell。

非常感谢!

最佳答案

参见 the BashFAQ entry on ParsingLS了解为什么其中许多答案是邪恶的。

下面的方法避免了这个陷阱(顺便说一句,完全忽略没有扩展名的文件):

shopt -s nullglob
for f in *.*; do
  printf '%s\n' ".${f#*.}"
done | sort -u

优点:

  • 正确性:ls 的行为不一致,可能导致不合适的结果。请参阅顶部的链接。
  • 效率:最小化调用的子进程数量(只有一个,sort -u,如果我们想使用 Bash 4 的关联数组来存储结果,也可以删除它)

还有待改进的地方:

  • 正确性:这将正确丢弃第一个 . 之前的文件名中的换行符(其他一些答案不会)——但是在第一个 . 之后带有换行符的文件名将被 sort 视为单独的条目。这可以通过使用空值作为分隔符或通过上述 bash 4 关联数组存储方法来解决。

关于file - 获取文件扩展名的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10177017/

相关文章:

regex - 如何使用 bash 和正则表达式排除单词列表中的单词?

Java 应用程序在一个系统上运行缓慢,但在另一个系统上运行却非常快?

java - 写入文件异常?

python,将Json写入文件

linux - 如何为 ls - l 命令的列着色

bash - 需要帮助理解一个奇怪的 bashrc 表达式

c++ - C++ 中的 Unicode 和 std::string

php - 取消设置 $this

bash - 在 bash/awk 中提取大括号之间的值的最佳方法是什么?

linux - Bash 脚本 : Recognizing paths drag-and-dropped to konsole