我需要获取文件夹中的所有文件扩展名类型。例如,如果目录的 ls 给出以下内容:
a.t
b.t.pg
c.bin
d.bin
e.old
f.txt
g.txt
我应该通过运行脚本来得到这个
.t
.t.pg
.bin
.old
.txt
我有一个 bash 外壳。
非常感谢!
请参阅ParsingLS 上的 BashFAQ 条目,了解为什么其中许多答案是邪恶的。
以下方法避免了这个陷阱(顺便说一下,完全忽略了没有扩展名的文件):
shopt -s nullglob
for f in *.*; do
printf '%s\n' ".${f#*.}"
done | sort -u
其中的优点:
ls
行为不一致,可能导致不适当的结果。请参阅顶部的链接。sort -u
如果我们想使用 Bash 4 的关联数组来存储结果,也可以删除)仍然可以改进的地方:
.
(其他一些答案不会) - 但是第一个之后的换行符.
将被视为单独的条目sort
。这可以通过使用空值作为分隔符或通过上述 bash 4 关联数组存储方法来解决。尝试这个:
ls -1 | sed 's/^[^.]*\(\..*\)$/\1/' | sort -u
ls
列出文件夹中的文件,每行一个文件sed
魔术提取扩展sort -u
对扩展进行排序并删除重复项sed 魔法读作:
s/ / /
: 将第一个和第二个/之间的任何内容替换为第二个和第三个之间的任何内容/^
: 匹配行首[^.]
: 匹配任何不是点的字符*
: 尽可能多地匹配它\(
和\)
:记住这两个括号之间的匹配项\.
: 匹配一个点.
: 匹配任意字符*
: 尽可能多地匹配它$
: 匹配行尾\1
:这是括号之间匹配的内容人们真的过于复杂了 - 特别是正则表达式:
ls | grep -o "\..*" | uniq
ls
- 获取所有文件
grep -o "\..*"
--o
仅显示匹配项;"\..*"
匹配第一个“。” & 之后的所有内容
uniq
- 不要打印重复但保持相同的顺序
喜欢也可以排序,但排序与示例不符
这是运行它时发生的情况:
> ls -1
a.t
a.t.pg
c.bin
d.bin
e.old
f.txt
g.txt
> ls | grep -o "\..*" | uniq
.t
.t.pg
.bin
.old
.txt