Pergunta

Eu tenho um número de arquivos em uma pasta, e eu quero substituir cada caractere de espaço em todos os nomes de arquivo com sublinhados. Como posso conseguir isso?

Foi útil?

Solução

Isso deve fazê-lo:

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

Outras dicas

Eu prefiro usar o comando 'renomeação', que leva expressões regulares Perl-style:

rename "s/ /_/g" *

Você pode fazer uma seca correr com a bandeira -n:

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

Use sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Se você quiser tentar fazer isso antes de puxar o gatilho apenas mudança mv para echo mv.

E se você deseja aplicar a tarefa de substituir recursivamente ? Como você faria isso?

Bem, eu só encontrei a resposta sozinho. Sem a solução mais elegante (tentativas para mudar o nome também arquivos que não cumprem a condição), mas obras. (Aliás, no meu caso eu precisava para renomear os arquivos com '% 20', não com um sublinhado)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done

Se você usar bash:

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

orçamento Sua variáveis:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Remova o "eco" para fazer a mudança de nome real.

Tente algo parecido com isto, assumindo que todos os seus arquivos foram .txt de:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

A maneira mais fácil de substituir uma string (caractere de espaço no seu caso) com outra string em Linux está usando sed. Você pode fazê-lo da seguinte maneira

sed -i 's/\s/_/g' *

Espero que isso ajude.

Aqui está uma outra solução:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. usos awk para adicionar aspas em torno do nome do arquivo
  2. usa sed para substituir o espaço com sublinhados; imprime o nome original com citações (de awk); então o nome substituído
  3. xargs leva 2 linhas de cada vez e passa para mv

Para renomear todos os arquivos com um uso de extensão .py, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Exemplo de saída,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top