
ls -1
lista meus elementos assim:
foo.png
bar.png
foobar.png
...
Eu quero que seja listado sem o .png
seguinte:
foo
bar
foobar
...
(o diretório contém apenas .png
arquivos)
Alguém pode me dizer como usar grep
neste caso?
Objetivo: Tenho um arquivo de texto onde estão listados todos os nomes sem a extensão. Quero fazer um script que compare o arquivo texto com a pasta para ver qual arquivo está faltando.
Responder1
ls -1 | sed -e 's/\.png$//'
O sed
comando remove (ou seja, substitui pela string vazia) qualquer string .png
encontrada nofimde um nome de arquivo.
The .
é escapado como \.
para que seja interpretado sed
como um caractere literal .
em vez de regexp .
(o que significa corresponder a qualquer caractere). É $
a âncora de fim de linha, portanto não corresponde .png
no meio de um nome de arquivo.
Responder2
Você só precisa do shell para este trabalho.
POSIXamente:
for f in *.png; do
printf '%s\n' "${f%.png}"
done
Com zsh
:
print -rl -- *.png(:r)
Responder3
Se você quiser apenas usar o bash:
for i in *; do echo "${i%.png}"; done
Você deve procurar grep
ao tentar encontrar correspondências, não para remover/substituir o que sed
é mais apropriado:
find . -maxdepth 1 -name "*.png" | sed 's/\.png$//'
Depois de decidir que precisa criar alguns subdiretórios para organizar seus arquivos PNG, você pode facilmente alterá-los para:
find . -name "*.png" | sed 's/\.png$//'
Responder4
Outra resposta muito semelhante (estou surpreso que esta variante específica ainda não tenha aparecido) é:
ls | sed -n 's/\.png$//p'
- Você não precisa da
-1
opção tols
, poisls
assume que se a saída padrão não for um terminal (é um pipe, neste caso). - a
-n
opçãosed
significa 'não imprimir a linha por padrão' - a
/p
opção no final da substituição significa '...e imprima esta linha se uma substituição foi feita'.
O efeito líquido disso é imprimir apenas as linhas que terminam em .png
, com o .png
removido. Ou seja, isso também atende à ligeira generalização da questão do OP, onde o diretório não contém apenas .png
arquivos.
A sed -n
técnica geralmente é útil em casos em que você poderia usar grep+sed.