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
.