Відповіді:
Спробуйте це (не впевнений, що це найкращий спосіб, але це працює):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
Він працює наступним чином:
git ls-tree -r HEAD --name-only
замістьfind
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
Немає необхідності в трубі sort
, awk може зробити це все:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
але сама команда вже використовує лапки в команді find. Щоб виправити це, я використав би bash
синтаксис буквального рядка так:alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
до кінця команду 'find' і повторіть запуск свого тесту.
Рекурсивна версія:
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
Я ґрунтувався на цьому на форумі , кредит повинен бути там.
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Powershell:
dir -recurse | select-object extension -unique
Завдяки http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
.
в собі (наприклад jquery-1.3.4
, відображатиметься як .4
у висновку). Змініть, щоб dir -file -recurse | select-object extension -unique
отримати лише розширення файлів.
Моя безвідмовна, без сед, без Perl, не підтримує Python, не підтримує POSIX:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
Хитрість полягає в тому, що вона перевертає лінію і скорочує розширення на початку.
Він також перетворює розширення в малі регістри.
Приклад виводу:
3689 jpg
1036 png
610 mp4
90 webm
90 mkv
57 mov
12 avi
10 txt
3 zip
2 ogv
1 xcf
1 trashinfo
1 sh
1 m4v
1 jpeg
1 ini
1 gqv
1 gcs
1 dv
uniq
не має повного прапора --count
, але -c
працює чудово
Знайдіть усе з крапкою та покажіть лише суфікс.
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
Додавання власної варіації до суміші. Я думаю, що це найпростіше з партії і може бути корисним, коли ефективність не викликає особливих проблем.
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
У Python використовують генератори для дуже великих каталогів, включаючи пусті розширення, і кількість разів, коли кожне розширення відображається:
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)
Тут я спробував купу відповідей, навіть "найкращу" відповідь. Всі вони виявились меншими від того, про що я конкретно пішов. Тож окрім останніх 12 годин сидіння у регулярному коді для декількох програм та читання та тестування цих відповідей це те, що я придумав, що працює ТОЧНО, як я хочу.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
Якщо вам потрібна кількість розширень файлів, тоді використовуйте наведений нижче код
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
Хоча ці методи потребують певного часу, і, ймовірно, не найкращі способи вирішити цю проблему, вони працюють.
Оновлення: задовго розширення файлу @ @_089 призведе до проблеми. Це пов’язано з оригінальним регулярним виразом "[[: alpha:]] {3,6}". Я оновив відповідь, щоб включити регулярний вираз "[[: alpha:]] {2,16}". Однак кожен, хто використовує цей код, повинен знати, що ці числа - це мінімальна та максимальна тривалість розширення, дозволеного для остаточного виводу. Все, що знаходиться поза цим діапазоном, буде розбито на кілька рядків у висновку.
Примітка. Оригінальна публікація прочитала "- Знімки для розширення файлів між 3 та 6 символами (просто відрегулюйте числа, якщо вони не відповідають вашим потребам). Це допомагає уникнути кеш-файлів та системних файлів (біт системного файлу - це пошук у в'язниці). "
Ідея: можна використовувати для пошуку розширень файлів певної довжини за допомогою:
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
Де 4 - довжина розширень для файлів, яку слід включити, а потім знайти також будь-які розширення, що перевищують цю довжину.
Оскільки існує вже інше рішення, яке використовує 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)"
Жодна з відповідей поки що не стосується імен файлів з новими рядками належним чином (за винятком 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
Я не думаю, що про це ще згадували:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
Я знайшов це просто і швидко ...
# find . -type f -exec basename {} \; | awk -F"." '{print $NF}' > /tmp/outfile.txt
# cat /tmp/outfile.txt | sort | uniq -c| sort -n > tmp/outfile_sorted.txt
У прийнятій відповіді використовується REGEX, і ви не можете створити команду псевдоніму з REGEX, ви повинні ввести її в сценарій оболонки, я використовую Amazon Linux 2 і зробив наступне:
Я поклав прийнятий код відповіді у файл, використовуючи:
sudo vim find.sh
додати цей код:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
збережіть файл, ввівши: :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
), використовуйтеfind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
джерело