Как я могу найти все отличные расширения файла в иерархии папок?

Попытка:

if (typeof(callback) == 'function')
218
задан GloryFish 3 December 2009 в 09:18
поделиться

6 ответов

Попробуйте это (не уверен, что это лучший способ, но он работает):

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

Это работает следующим образом:

  • Найти все файлы в текущей папке
  • Печатать расширения файлов, если они есть
  • Создать уникальный отсортированный список
322
ответ дан 23 November 2019 в 04:11
поделиться

Ни один из ответов до сих пор не касался должным образом имен файлов с символами новой строки (за исключением 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
2
ответ дан 23 November 2019 в 04:11
поделиться

Поскольку уже существует другое решение, использующее 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)"
3
ответ дан 23 November 2019 в 04:11
поделиться

Найдите все с точкой и покажите только суффикс.

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
12
ответ дан 23 November 2019 в 04:11
поделиться

Рекурсивная версия:

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

I '

36
ответ дан 23 November 2019 в 04:11
поделиться

Powershell:

dir -recurse | select-object extension -unique

Спасибо http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html

24
ответ дан 23 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: