/ / скрипт для отримання розширень файлу - файл, bash

скрипт для отримання розширень файлу - файл, bash

Мені потрібно отримати всі типи розширень файлів у папці. Наприклад, якщо каталог "s ls дає таке:

a.t
b.t.pg
c.bin
d.bin
e.old
f.txt
g.txt

Я повинен отримати це, запустивши сценарій

.t
.t.pg
.bin
.old
.txt

У мене панцир.

Дуже дякую!

Відповіді:

3 для відповіді № 1

спробуйте це:

ls -1 | sed "s/^[^.]*(..*)$/1/" | sort -u
  • ls перераховує файли у вашій папці, по одному файлу на рядок
  • sed чарівні екстракти розширення
  • sort -u сортує розширення та видаляє дублікати

sed magic читається як:

  • s/ / /: замінює все, що знаходиться між першим і другим / тим, що знаходиться між другим і третім /
  • ^: відповідність початку рядка
  • [^.]: відповідає будь-якому символу, який не є крапкою
  • *: співставити його якомога більше разів
  • ( і ): запам’ятайте все, що відповідає між цими двома дужками
  • .: збіг крапки
  • .: відповідає будь-якому символу
  • *: співставити його якомога більше разів
  • $: відповідність кінця рядка
  • 1: це відповідність між дужками

7 для відповіді № 2

Побачити запис BashFAQ на ParsingLS для опису того, чому багато з цих відповідей є злими.

Наступний підхід дозволяє уникнути цієї невдачі (і, до речі, повністю ігнорує файли без розширення):

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

Серед переваг:

  • Правильність: ls поводиться непослідовно і може призвести до невідповідних результатів. Дивіться посилання вгорі.
  • Ефективність: мінімізує кількість викликаних підпроцесів (лише один, sort -u, і це може бути видалено також, якби ми хотіли використовувати асоціативні масиви Bash 4 для зберігання результатів)

Речі, які ще можна вдосконалити:

  • Правильність: це буде правильно відкинути нові рядки у іменах до першої . (на які деякі інші відповіді виграли "t) - але назви файлів з новими рядками після першого . буде розглянуто як окремі записи sort. Це можна виправити, використовуючи нулі в якості роздільника, або за допомогою вищезазначеного підходу для зберігання асоціативного масиву bash 4.

0 для відповіді № 3

Люди насправді надто ускладнюють це, зокрема, регулярний вираз:

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