2009-12-03 113 views

回答

237

試試這個(不知道這是最好的方式,但它的工作原理):

find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u 

它的工作如下:

  • 從當前文件夾
  • 打印擴展的查找所有文件文件如果有的話
  • 做一個獨特的排序列表
+5

僅供參考:如果你想從搜索排除了某些目錄(例如'.svn'),使用'找到。 -type f -path'* /。svn *'-prune -o -print | perl -ne'print $ 1 if m /\.([^.//]+)$/'| sort -u' [source](http://stackoverflow.com/a/2314680/304209) – 2012-11-22 13:05:01

+0

這會處理正確的名稱空間嗎? – 2013-08-19 19:54:05

+0

空格不會有任何區別。每個文件名將分隔開,因此文件列表分隔符將爲「\ n」而非空格。 – 2013-08-20 20:43:01

19

遞歸版本:

find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u 

如果你想總數(怎麼可能時間延長看到):

find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn 

非遞歸(單個文件夾):

for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u 

我基於這個this forum post,信貸應該去那裏。

+0

你將對每個文件名執行bash,你會發現? – ghostdog74 2009-12-04 00:02:59

+0

好點,改變了解決方案... – ChristopheD 2009-12-04 08:07:10

10

用點找到everythin並只顯示後綴。

find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u 

,如果你知道所有的後綴有3個字符,那麼

find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u 

或SED顯示一至四個字符的所有後綴。將{1,4}更改爲您在後綴中預期的字符範圍。

find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u 
+1

不需要管道'排序',awk可以做到這一切:找到。 -type f -name「*。*」| awk -F。 '!a [$ NF] ++ {print $ NF}' – SiegeX 2009-12-06 12:14:49

+0

它的輸出也是uniq!太好了! – user224243 2009-12-06 20:21:17

+0

@SiegeX你應該是一個單獨的答案。它發現該命令最適合用於大文件夾,因爲它在找到它們時打印擴展名。但請注意,它應該是:-name「*。*」 – Ralf 2011-08-18 07:54:05

2

既然已經有它使用Perl的另一種解決方案:

如果您已經安裝了Python,你也可以(從殼)做:

python -c "import os;e=set();[[e.add(os.path.splitext(f)[-1]) for f in fn]for _,_,fn in os.walk('/home')];print '\n'.join(e)" 
1

的答覆無迄今處理帶有換行符的文件名(除了ChristopheD,這是我輸入時才輸入的)。以下內容不是單行的,而是有效的,而且速度相當快。

import os, sys 

def names(roots): 
    for root in roots: 
     for a, b, basenames in os.walk(root): 
      for basename in basenames: 
       yield basename 

sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:])) 
for suf in sufs: 
    if suf: 
     print suf 
16

PowerShell的:

dir -recurse | select-object extension -unique 

由於http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html

+18

該OP說:「在一臺Linux機器上」 – Forbesmyester 2013-08-05 13:37:07

+2

實際上現在有用於Linux的prowershell:https://github.com/Microsoft/PowerShell-DSC-for-Linux – KIC 2016-09-16 13:44:16

+0

正如書面,這也將拿起目錄,有一個'.'(例如'jquery-1.3.4'將在輸出中顯示爲'.4')。切換到'dir -file -recurse |選擇對象擴展-unique'只獲得文件擴展名。 – mcw0933 2018-03-05 15:49:12

33

不用了,管sort,AWK可以做到這一切:使用發電機非常

find . -type f | awk -F. '!a[$NF]++{print $NF}' 
+0

我沒有得到這個工作作爲別名,我得到awk:在源代碼行1的語法錯誤 上下文是 \t >>>!a [] <<< awk:在源代碼行1救援。什麼是我做錯了?我的別名定義如下:alias file_ext =「find。-type f -name'*。*'| awk -F。'!a [$ NF] ++ {print $ NF}'」 – user2602152 2015-03-01 15:55:11

+2

@ user2602152問題是您試圖用'alias'命令的引號來包圍整個單行程,但命令本身已經在find命令中使用了引號。爲了解決這個問題,我會使用'bash'的字符串語法:'alias file_ext = $'find。 -type f -name「*。*」| awk -F。 \'!a [$ NF] ++ {print $ NF} \''' – SiegeX 2015-03-14 06:04:14

+0

謝謝! – user2602152 2015-03-15 19:20:59

4

在Python大目錄,包括空白擴展名,以及獲取ti的數量MES每個擴展顯示出來:

import json 
import collections 
import itertools 
import os 

root = '/home/andres' 
files = itertools.chain.from_iterable((
    files for _,_,files in os.walk(root) 
    )) 
counter = collections.Counter(
    (os.path.splitext(file_)[1] for file_ in files) 
) 
print json.dumps(counter, indent=2) 
0

你也可以做到這一點

find . -type f -name "*.php" -exec PATHTOAPP {} + 
6

加入我自己的變化的組合。我認爲這是最簡單的方法,當效率不是一個大問題時,它可能很有用。

find . -type f | grep -o -E '\.[^\.]+$' | sort -u 
+1

+1表示可移植性,但正則表達式非常有限,因爲它只匹配由單個字母組成的擴展名。從接受的答案中使用正則表達式似乎更好:'$ find。 -type f | grep -o -E'\。[^。\ /] + $'|排序-u' – mMontu 2013-12-09 11:48:39

+1

同意。我在那裏放鬆一下。編輯我的答案以解決您發現的錯誤。 – gkb0986 2013-12-09 17:38:18

+0

很酷。我用雙引號括起引號,更新grep [biraries和** dependencies **](http://gnuwin32.sourceforge.net/packages/grep.htm)(因爲提供的git已經過時),現在在windows下工作。感覺像linux用戶。 – msangel 2015-04-21 00:24:16

5

我嘗試了一堆這裏的答案,即使是「最好」的答案。他們都沒有達到我特別追求的目標。因此,除了過去12個小時爲多個程序提供正則表達式代碼以及閱讀和測試這些答案之外,我想到了這一點,它完全像我想要的那樣工作。

find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{3,6}" | awk '{print tolower($0)}' | sort -u 
  • 查找可能有一個擴展名的文件。
  • Greps只有擴展名
  • greps用於3到6個字符之間的文件擴展名(如果它們不符合您的需要,就調整數字)。這有助於避免緩存文件和系統文件(系統文件位是搜索監獄)。
  • Awk以小寫形式打印擴展名。
  • 排序並引入唯一值。最初我試圖嘗試awk的答案,但它會加倍打印大小寫敏感的項目。

如果您需要的文件擴展名的計數,然後用下面的代碼

find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{3,6}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn 

雖然這些方法需要一定的時間才能完成,可能是不着手解決問題的最佳途徑, 他們工作。

+0

計數版本是否遞歸? – 2016-02-03 03:51:15

+0

優秀的答案@Shinrai ....謝謝! – raTM 2016-08-05 20:20:05

+0

@Shinrai,一般運作良好。但是如果你有一些隨機文件擴展名很長,如.download,它會將「.download」分成2部分,並報告2個文件,一個是「downlo」,另一個是「ad」 – 2017-12-09 20:49:07

0

我覺得最簡單的&直接的方法是

for f in *.*; do echo "${f##*.}"; done | sort -u 

它在ChristopheD的第三方式修改。

相關問題