/ / script para obter extensões de um arquivo - arquivo, bash

script para obter extensões de um arquivo - arquivo, bash

Eu preciso obter todos os tipos de extensão de arquivo em uma pasta. Por exemplo, se o diretório "s ls fornecer o seguinte:

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

Eu deveria pegar isso executando o script

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

Eu tenho um shell bash.

Muito obrigado!

Respostas:

3 para resposta № 1

tente isto:

ls -1 | sed "s/^[^.]*(..*)$/1/" | sort -u
  • ls lista arquivos em sua pasta, um arquivo por linha
  • sed extrações de extratos mágicos
  • sort -u classifica extensões e remove duplicatas

sed magic lê como:

  • s/ / /: substitui o que quer que seja entre primeiro e segundo / por qualquer que seja entre segundo e terceiro /
  • ^: partida de partida da linha
  • [^.]: corresponde a qualquer caractere que não seja um ponto
  • *: combine-o quantas vezes for possível
  • ( e ): lembre-se do que é correspondido entre esses dois parênteses
  • .: combinar um ponto
  • .: corresponde a qualquer personagem
  • *: combine-o quantas vezes for possível
  • $: final do jogo da linha
  • 1: isto é o que foi combinado entre parênteses

7 para resposta № 2

Vejo a entrada BashFAQ no ParsingLS para uma descrição de por que muitas dessas respostas são más.

A abordagem a seguir evita essa armadilha (e, a propósito, ignora completamente os arquivos sem extensão):

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

Entre as vantagens:

  • Correção: ls se comporta de maneira inconsistente e pode resultar em resultados inadequados. Veja o link no topo.
  • Eficiência: Minimiza o número de subprocessos invocados (somente um, sort -ue isso também poderia ser removido se quiséssemos usar os arrays associativos do Bash 4 para armazenar resultados)

Coisas que ainda poderiam ser melhoradas:

  • Correção: isto irá descartar corretamente novas linhas em nomes de arquivos antes da primeira . (que algumas outras respostas ganharam "t") - mas nomes de arquivos com novas linhas após o primeiro . serão tratados como entradas separadas por sort. Isso pode ser corrigido usando nulos como delimitador ou pela abordagem de armazenamento de matriz associativa bash 4 mencionada anteriormente.

0 para resposta № 3

As pessoas estão realmente complicando demais isso - particularmente o regex:

ls | grep -o "..*" | uniq

ls - obtenha todos os arquivos
grep -o "..*" - -o mostre somente o fósforo; "..*" coincidir com o primeiro "." e tudo depois disso
uniq - não imprima duplicatas, mas mantenha o mesmo pedido

você também pode classificar se quiser, mas a classificação não corresponde ao exemplo

Isto é o que acontece quando você o executa:

> 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