Abrevia o nome do arquivo Linux (truncar em um símbolo)

2

Eu tenho uma lista de arquivos no Linux que eu quero encurtar. Eles estão no seguinte formato: WhatIWant_WhatIDoNotWant.txt.

Existe uma maneira fácil de fazê-los: WhatIWant.txt? Eu vi a seguinte questão (link abaixo) e eu realmente gosto do laço for do (apenas no caso do resultado ter uma duplicata), mas eu não sei como obter o valor de local do sublinhado (_) para alimentar isso em em vez de usar o 16º caractere como o ponto final ...

script ou programa Linux para encurtar nomes de arquivos

    
por Padawan 22.08.2016 / 22:19

2 respostas

1
# We loop over the file with extension txt
for f in *.txt; do
    # We rename the file removing _ and the remaining part including the extension
    mv $f "${f/_*}".txt
done
    
por 22.08.2016 / 22:32
3

A expansão variável ${varname%_*} removerá tudo do (último) _ até o final da string.

Então, por exemplo

$ name=WhatIWant_WhatIDontWant.txt
$ echo ${name%_*}
WhatIWant

Note que também remove o .txt .

Para que possamos criar um loop simples:

for name in *.txt
do
  mv -i "$name" "${name%_*}.txt"
done

Se você quiser esta recursiva, então algo como

find . -name '*.txt' | while read -r "name"
do
  mv -i "$name" "${name%_*}.txt"
done

pode ser suficiente, mas tenha cuidado se algum arquivo tiver um caractere de retorno incorporado; que quebraria esse loop.

    
por 22.08.2016 / 22:34