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 № 1tente isto:
ls -1 | sed "s/^[^.]*(..*)$/1/" | sort -u
ls
lista arquivos em sua pasta, um arquivo por linhased
extrações de extratos mágicossort -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 linha1
: 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 -u
e 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 porsort
. 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