簡體   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