Isso parece que deve fazer o trabalho:
find . -type f -name '*\.' -exec bash -c 'mv "$1" "${$1%.}"' _ {} \;
Isso limita a localização a apenas arquivos com um ponto final (caso contrário, ele corresponde ao diretório de trabalho atual, '.') e, em seguida, executa o fragmento de shell entre aspas ( mv "$1" "${$1%.}"
) para cada nome de arquivo encontrado. Dentro do fragmento de shell, ele usa expansão e substituição de parâmetro bash para remover o '.' Final. O outro ruído de linha no final é necessário para o find -exec: {}
é o texto correspondente do find, \;
é necessário para terminar a string execut, e eu acredito que o _
diz ao exec para passar { } como um parâmetro ( $1
) para o comando sh
. Para ser honesto, este uso específico de -exec é novo para mim, eu achei aqui .
O bit de substituição bash é bastante direto, e eu uso isso com bastante frequência para renomear arquivos, por exemplo, FILENAME=foo.JPG; mv ${FILENAME} ${FILENAME%.JPG}.jpg
removerá o '.JPG' de FILENAME e substituirá por '.jpg'
Se você ainda quiser usar o sed em vez da expansão do bash, parece que ele faria o trabalho:
find . -type f -name '*\.' -exec sh -c 'mv "{}" "$(echo {} | sed s/\.$// )"' \;
Primeiro tentei resolver isso sem fazer com que -exec
invocasse sh -c
, mas não gostasse de {} sair da expansão ao tentar executar o sed (ou com o exemplo de substituição bash antes).
Observe também que você precisa "" colocar os nomes dos arquivos que você está expandindo (por exemplo, {} ou $ 1, dependendo do exemplo), pois os arquivos de amostra têm espaços neles. Isso ainda pode ser interrompido, dependendo de quais caracteres especiais estão no seu arquivo (por exemplo, um "no nome do arquivo causará problemas).