[英]script for getting extensions of a file
我需要在文件夹中获取所有文件扩展名类型。 例如,如果目录的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
magic提取扩展名 sort -u
扩展名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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.