Substituir sublinhados por espaços para todos os arquivos no diretório

3

Para todos os arquivos em um diretório, quero substituir os sublinhados no nome do arquivo por espaços.

Eu tentei esta solução, que faz o oposto do que eu quero: link

Mas mudou o espaço com o sublinhado. Isso não funciona, dando o erro

´x´ is not a directory

Onde x é a última palavra no nome do arquivo, por exemplo hello_world_x

Qual é o comando correto para substituir sublinhados por espaços para todos os arquivos em um diretório?

    
por Anonymous Entity 02.12.2015 / 17:39

3 respostas

11

Depois de clicar no diretório correto, esse script solucionará de forma confiável sua necessidade (não é possível devido à expansão ${var//pat/str} ):

#!/bin/bash

set -- *_*
for file; do
    mv -- "$file" "${file//_/ }"
done

*_* O glob *_* selecionará todos os arquivos que possuem _ em seus nomes.

set -- Esses nomes (incluindo espaços ou novas linhas) serão definidos confiavelmente nos parâmetros posicionais $1 , $2 , etc. com o comando simples set -- "list"

for file; Em seguida, cada parâmetro posicional será (por sua vez) atribuído ao arquivo var.

do ... done contém os comandos para executar (para cada $file ).

mv -- "$file" "${file//_/ }" moverá (renomear) cada arquivo para o mesmo nome com cada (todos) _ substituído por (espaço).

Observação : você pode adicionar a opção -i (interativo) para evitar a substituição de arquivos já existentes. Se o arquivo existir, mv perguntará. Com uma ressalva: é preciso haver um shell interativo em que mv possa se comunicar com o usuário.

mv -i -- "$file" "${file//_/ }"
    
por 02.12.2015 / 19:23
7

Plagiando o código da resposta que você vinculou e tornando-o mais robusto:

for file in *; do mv "$file" "$(echo "$file" | tr '_' ' ')" ; done

As citações garantem que cada nome de arquivo seja passado para mv como um único token, em vez de ser quebrado nos limites do espaço.

Se você tiver acesso ao utilitário de renomeação baseado em Perl, as seguintes também funcionará:

rename -n 's/_/ /g' *

(Remova a chave -n depois de confirmar que a visualização corresponde para o que você gostaria de fazer.)

    
por 02.12.2015 / 17:49
1
find . -depth -name "*_*" -exec \
    sh -cf '
        for f do   IFS=_
            IFS=\  set "${f%/*}/"${f##*/}$0
            mv "$f" "$*"
        done
    ' _ {} +

um POSIX sh expandirá as alterações conforme configurado com seu Separador de campo interno .

    
por 02.12.2015 / 19:53

Tags