Isso deve funcionar:
find . -maxdepth 1 -type f -name '*\?*' |\
while read FILENAME
do
IFS='?'
SPLIT_FILENAME=(${FILENAME})
unset IFS
echo mv "${FILENAME}" "${SPLIT_FILENAME}"
# mv "${FILENAME}" "${SPLIT_FILENAME}"
done
O find . indica que toda a ação acontece no diretório atual, bem como nos diretórios filhos; sinta-se livre para mudar esse . para ser o caminho completo / real do que você está agindo. O -name '*\?*' procura arquivos com um ponto de interrogação ( ? ) em seu nome.
Esta versão inicial / demo também tem um -maxdepth definido para "1", então o processo não sai do controle em seu sistema de arquivos e usa uma versão echo do comando para mostrar o que ele faria antes de executá-lo de verdade.
Se você executar uma saída com boa aparência, sinta-se à vontade para ajustar o -maxdepth 1 para algo como -maxdepth 9 ou até mesmo removê-la totalmente e comentar a linha echo e descomentar a linha mv é assim:
find . -type f -name '*\?*' |\
while read FILENAME
do
IFS='?'
SPLIT_FILENAME=(${FILENAME})
unset IFS
# echo mv "${FILENAME}" "${SPLIT_FILENAME}"
mv "${FILENAME}" "${SPLIT_FILENAME}"
done
Usando o exemplo de arquivo de teste de style.css?ver=4.2.5.css , recebi essa saída ao executar esse script no sistema Mac OS X 10.9.5 (Mavericks):
mv ./style.css?ver=4.2.5.css ./style.css
Parece uma boa mudança para mim. Corri com o comando mv real e o arquivo foi renomeado com sucesso para style.css . Isso também funcionaria com arquivos que possuem espaços, como arquivos de teste como this is my style.css?ver=4.2.5.css e my style.css?ver=4.2.5.css .