cortando um nome de diretório com várias instâncias do mesmo delimitador (Shell)

0

Eu tenho diretórios que eu quero renomear por exemplo: 10-00017_S9_L001_plasmidspades_careful

Quero renomeá-los para apenas 10-00017_S9_L001 part

Eu tentei usar o comando de corte echo "$filename" | cut -d'_' -f3 , mas isso me deixa apenas com a parte L001 do nome do arquivo.

Obviamente, eu poderia renomeá-los manualmente, mas há centenas de diretórios e não tenho tempo.

Existe uma maneira de usar o comando cut para obter tudo antes da instância específica do delimitador ou, de fato, qualquer outra coisa que eu possa usar?

    
por A. Murray 16.11.2018 / 14:20

3 respostas

1

A melhor solução é usar rename (Debian) ou prename (RedHat) (mesmo comando, nome diferente) (esses pacotes podem ter que ser adicionados a partir dos repos de distribuição padrão). Ele usa expressões regulares (estilo Perl). Por exemplo, tentando ser um pouco estrito no jogo:

rename -n 's/(\d+_\d+_S\d_L\d+)_.+/$1/' *

ou mais branda:

rename -n 's/(.+_.+_.+_.+)_.+/$1/' *

Com -n apenas mostra o que faria, remova (ou melhor, substitua por -v ) para execução real.

Anote as aspas simples ao redor do padrão para evitar a substituição por barras invertidas e dólares.

    
por 16.11.2018 / 14:33
0

Uma solução de baixa tecnologia:

  • Use ls ou find para criar uma lista de diretório em um arquivo
  • Use um editor com o qual você esteja familiarizado para substituir cada linha (que contém apenas oldname by mv oldname newname )
  • Execute o script:

    . list_of_moves
    

    (observe o espaço de pontos)

por 16.11.2018 / 14:43
0

Coloque todos os diretórios em um arquivo e execute o comando abaixo para que seja renomeado

awk '{print "mv"  " "   $1  " " substr($1,1,16)}' filename | sh

Testado para o dirtectoy mencionado acima e funcionou bem

echo "10-00017_S9_L001_plasmidspades_careful" | awk '{print "mv"  " "   $1  " " substr($1,1,16)}' | sh
    
por 16.11.2018 / 17:18

Tags