Restringindo Expansão do Nome do Arquivo do Bash

0

Para gravar arquivos em um volume USB, quero renomear nomes de arquivos contendo '?', '"', '*' ou ':' para substituir qualquer um desses caracteres por um espaço. o '*'. Meu script bash é

for file in * 
do 
    mv -v "'"$file"'" "'"$(echo "$file" | sed 's/\(.*\)[?"*:]\(.*\)/ /')"'" 
done

O '*' continua sendo expandido para os nomes de arquivos no diretório atual. Eu tentei usar

set -f

mas a inicial 'in *' não funciona.

    
por ottotts 15.11.2018 / 13:24

2 respostas

3

Apenas certifique-se de citar seus nomes de arquivo corretamente e não haverá problemas.

for name in ./*; do
    newname=${name//[?\"*:]/ }
    if [ "$newname" != "$name" ]; then
        mv -iv "$name" "$newname"
    fi
done

Seu "'"$file"'" , na verdade, deixa $file completamente sem aspas (cercado por aspas simples, mas elas não citam a variável ou seu valor, pois elas mesmas são citadas).

Veja também:

Em relação ao seu sed bit.

sed tem um pequeno comando que muitos parecem ignorar chamado y :

sed 'y/?"*:/    /'

Isso mudaria todos os caracteres na primeira parte da expressão para o caractere correspondente na segunda parte (aqui todos os espaços).

tr também funciona:

tr '?"*:' '    '

Mas, neste caso, seria mais conveniente usar o recurso interno de substituição de parâmetros de bash para fazer as alterações necessárias.

    
por 15.11.2018 / 13:53
0

Você tem coisas estranhas acontecendo com você.

Comece alterando o "'" para "

    
por 15.11.2018 / 13:35