繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM