# 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
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 ...
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.