我需要获取文件夹中的所有文件扩展名类型。例如,如果目录的 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/