Eu tenho esses arquivos zip:
PLP_633555_2015-03-04_01-12-01.zip
PLP_634562_2004-03-02_02-15-07_UBIC.zip
PLP_563462_2008-05-02_01-21-03_UBIC_STOC.zip
E preciso que cada zip seja extraído em seu diretório apropriado com este formato (basicamente, preciso apenas dos primeiros 30 caracteres):
PLP_633555_2015-03-04_01-12-01
PLP_634562_2004-03-02_02-15-07
PLP_563462_2008-05-02_01-21-03
Este é o comando que tenho atualmente, que funciona mas apenas para o segundo arquivo zip (PLP_634562_2004-03-02_02-15-07_UBIC.zip)
for f in /PLP*.zip; do n=$(echo $f | cut -f 1-5 -d '_'); unzip -d $n $f;done
Gostaria de alterá-lo para que leia apenas os primeiros 30 caracteres do arquivo zip e depois crie o diretório com base nisso. Isso garantirá que qualquer novo formato de nomenclatura de arquivo zip funcione no futuro.
Eu tentei mudar a parte da variável n do comando para isso
n=$(echo ${f:0:30});
mas isso não funcionou. Estou usando o Linux bash.
Responder1
Com sed
você pode obter os primeiros 30 caracteres:
sed 's|\(.\{30\}\).*|\1|'
e use isso em vez de cut
no seu for
loop.
O detalhamento dessa sed
substituição é que o que corresponde entre \( \)
você substitui por \1
. o {30}
(escapado com \
) conta 30 caracteres únicos ( .
).
Responder2
Obrigado por todas as sugestões, peguei pedaços das sugestões de todos e construí este comando. No meu caso, este é exatamente o comando que eu solicitei.
for f in /mydirectory/*.zip; do
n=$(echo ${f##*/} | cut -c1-30);
unzip -d /mydirectory/$n $f;
done
- Ele percorre todos os arquivos zip
- Ecoa cada arquivo zip (apenas o nome do arquivo, nenhuma informação extra como tamanho ou caminho é exibida) e então mostra apenas os primeiros 30 caracteres e os armazena em n variáveis
- Em seguida, ele extrai o conteúdo para um novo diretório (usando n variáveis) para cada arquivo zip.
No meu caso, coloquei isso em um script que roda em outro diretório.