Por que esse comando Bash usando regex não está substituindo meus colchetes?

1

Eu tenho este comando para percorrer todos os meus arquivos no diretório Music e todos os subdiretórios e substituir os colchetes no nome do arquivo por colchetes arredondados:

find /home/Music/ -depth -name "* *" -execdir rename 's/\[/\(/g' "{}" \;

Mas isso não funciona. Não retorna nenhum erro, apenas não faz as substituições.

Eu achei que escapei dos personagens adequadamente. Para onde estou indo errado?

Além disso, eventualmente, eu quero substituir as chaves, {} , com colchetes arredondados, () também. Pensei em mencionar isso agora, caso os colchetes tivessem ainda mais complicações.

    
por Questioner 07.04.2013 / 05:47

3 respostas

2

A única razão pela qual não vejo porque não funcionaria é se não houver arquivos com espaços em seus nomes. O padrão "* *" corresponderá apenas se o nome do arquivo tiver um espaço.

Se você quiser encontrar arquivos cujo nome contém colchetes, faça

find /home/Music/ -depth -name "*[*" -execdir rename 's/\[/\(/g' "{}" \;
    
por 07.04.2013 / 19:08
2

Existem duas implementações rename principais no Linux:

  • O que vem com perl (que provavelmente é o que você esperava)
  • O que vem com o util-linux (provavelmente o que você tem).

A sintaxe para o que vem com util-linux seria:

find ... -execdir rename '[' '(' {} +

No entanto, isso apenas substituirá uma ocorrência de [ .

perl ' rename pode ser chamado de prename no seu sistema.

Uma alternativa para rename é zmv de zsh. Ele cuidaria da profundidade dos diretórios descendentes primeiro e evitaria problemas com colisões.

No zsh:

autoload zmv
zmv '(**/)(* *)' '$1${2//\[/(}'

E para converter {} e [] para () :

zmv -n '(**/)(* *)' '$1${${2//[]\}]/)}//[[{]/(}'    
    
por 07.04.2013 / 17:20
1

Os seguintes itens devem funcionar:

for i in 'find o -type f'; do new="${i/\[/(}" ; if [ "${i}" != "${new}" ]; then mv ${i} ${new} ; echo "Moving ${i} to ${new}"; fi ; done

Se os nomes dos arquivos contiverem espaços, tente o seguinte:

OLDIFS=${IFS} ; IFS=$(echo -en "\n\b") ; for i in 'find o -type f'; do new="${i/\[/(}" ; if [ "${i}" != "${new}" ]; then mv ${i} ${new} ; echo "Moving ${i} to ${new}"; fi ; done; IFS=${OLDIFS}
    
por 07.04.2013 / 13:42