用于获取文件扩展名的脚本

时间:2012-04-16 15:24:51

标签: 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。

非常感谢!

3 个答案:

答案 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