Conheça a ferramenta Perl rename
:
$ rename -n -v 's/~[^.]+//' *~*
rename(ABCDEF~20160531-162719, ABCDEF)
rename(Letter to Client 27May2016~20160531-162719.pdf, Letter to Client 27May2016.pdf)
( página man online , também verse isto Q )
Esse regex diz para combinar um til, como muitos caracteres que não são pontos, mas pelo menos um; e para substituir o que combina com uma string vazia. Remova o -n
para realmente fazer a substituição. Poderíamos alterar o padrão para ~[-0-9]+
para substituir apenas dígitos e traços.
Desculpe, você disse "recursivamente", então vamos usar find
:
$ find -type f -name "*~*" -execdir rename -n -v 's/~[-0-9]+//' {} +
rename(./ABCDEF~20160531-162719, ./ABCDEF)
rename(./Letter to Client 27May2016~20160531-162719.pdf, ./Letter to Client 27May2016.pdf)
Ou apenas com o Bash ou o ksh, embora os diretórios com ~
seguido por dígitos quebrem isso:
$ shopt -s extglob # not needed in ksh (as far as I can tell)
$ shopt -s globstar # 'set -o globstar' in ksh
$ for f in **/*~* ; do
g=${f//~+([-0-9])/};
echo mv -- "$f" "$g"
done
mv -- ABCDEF~20160531-162719 ABCDEF
mv -- Letter to Client 27May2016~20160531-162719.pdf Letter to Client 27May2016.pdf
Novamente, remova o echo
para fazer a renomeação.