Мені потрібно отримати всі типи розширень файлів у папці. Наприклад, якщо каталог "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