Como extrair a primeira parte dos nomes de arquivo com o mesmo sufixo?

1

Eu quero pegar o prefixo de um nome de arquivo de comprimento variável.

In: some_filename_123-uniq.tar.gz
Out: some_filename_123
In: some_filename_1-uniq.tar.gz
Out: some_filename_1

Isso faz exatamente o oposto do que eu quero, -uniq.tar.gz :

result=$(echo *-uniq.tar.gz | rev | cut -c-12 | rev)
echo $result

Haverá sempre um item com -uniq.tar.gz com sufixo.

Eu tentei usar a substituição de parâmetro, que parecia ser o caminho mais fácil, mas recebi erros de sintaxe:

${"some_filename_123-uniq.tar.gz"//"-uniq.tar.gz"}
bash: ${"some_filename_123-uniq.tar.gz"/""/"-uniq.tar.gz"}: bad substitution
    
por tarabyte 09.12.2015 / 04:29

2 respostas

2

I attempted using parameter substitution which seemed like the easiest way to go

é o caminho mais fácil (apenas tenha em mente que, como o nome sugere - e como apontado em um comentário, o shell expande um parâmetro / variável ) e
use ${var%-*} para (com relutância) remover o sufixo (neste caso, começando do último - ):

for f in ./*-uniq.tar.gz
do
printf %s\n "${f%-*}"   
done

ou ${var:offset:length} para remover os últimos N caracteres (onde comprimento é um número inteiro negativo):

for f in ./*-uniq.tar.gz
do
printf %s\n "${f:0:-12}"
done
    
por 09.12.2015 / 13:14
2

Esta é uma maneira rápida e suja, apenas use sed para substituir essa string sem nada (remover):

for i in *-uniq.tar.gz
do
result=$(echo $i | sed 's/-uniq.tar.gz$//')
echo "$result"
done

O acima irá passar por um diretório procurando por qualquer coisa que termine em -uniq.tar.gz e então ecoará o resultado depois que ele remover a porção final.

    
por 09.12.2015 / 04:49