我需要在文件夹中获取所有文件扩展名类型。例如,如果目录的ls给出以下内容:
a.t
b.t.pg
c.bin
d.bin
e.old
f.txt
g.txt
我应该通过运行脚本
来实现.t
.t.pg
.bin
.old
.txt
我有一个bash shell。
非常感谢!
答案 0 :(得分:7)
请参阅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
。这可以通过使用null作为分隔符,或通过前面提到的bash 4关联数组存储方法来解决。答案 1 :(得分:3)
试试这个:
ls -1 | sed 's/^[^.]*\(\..*\)$/\1/' | sort -u
ls
列出文件夹中的文件,每行一个文件sed
魔术提取扩展sort -u
对扩展程序进行排序并删除重复项sed magic读作:
s/ / /
:替换第一个和第二个之间的任何内容/通过第二个和第三个之间的任何内容/ ^
:匹配行的开头[^.]
:匹配任何不是点的字符*
:尽可能多地匹配\(
和\)
:记住这两个括号中匹配的内容\.
:匹配点.
:匹配任何字符*
:尽可能多地匹配$
:匹配行尾\1
:这是括号中匹配的内容答案 2 :(得分:0)
人们真的过于复杂了 - 特别是正则表达式:
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