Linux - Substituindo espaços nos nomes dos arquivos


Respostas:


172

Isso deve servir:

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

Isso não funcionou para mim. Alegou que existiam arquivos idênticos (com nomes de arquivo errados). Por exemplo, tentando renomear 1 - foo.jpge minha pasta já tinha 1.jpgnele.
byxor

3
Acho os crases um pouco difíceis de ler quando estão perto de aspas. O mesmo, mas mais legível seriafor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron

Nota: Isso é executado DENTRO do diretório cujos nomes de arquivos você deseja atualizar. Alternativamente, você pode mudar *para PATH_TO_YOUR_DIRECTORY.
CFitz

71

Eu prefiro usar o comando 'renomear', que usa regexes no estilo Perl:

rename "s/ /_/g" *

Você pode fazer uma simulação com a sinalização -n:

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

3
isso funcionará se você tiver a renomeação perl-style e não o redhat / fedora mais simples
David Dean

9
a versão do fedora seriarename " " "_" *
David Dean

4
renamenão disponível no OSX, parece.
Etienne Low-Décarie

No macOS 10.12.3, renameestá disponível.
Sung Cho

1
@DavidDean A renomeação no Arch Linux substituirá apenas a primeira ocorrência (não é muito conveniente para arquivos / diretórios com vários espaços). Ele tem a mesma sintaxe do fedora, então eu suspeito que eles podem ser o mesmo. Mas perl-rename pode ser instalado.
prosoitos de

15

Use sh ...

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

Se quiser experimentar antes de puxar o gatilho, mude mvpara echo mv.


4

Se você usar o bash:

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

quando tentei, obtive mv: ao mover vários arquivos, o último argumento deve ser um diretório Tente mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help 'para obter mais informações.
Mithun Sreedharan

Novamente erro mv: argumento de arquivo ausente Tente mv --help' for more information. mv: missing file argument Try mv --help 'para obter mais informações. mv: argumento de arquivo ausente Tente mv --help' for more information. mv: missing file argument Try mv --help 'para obter mais informações.
Mithun Sreedharan

@ levislevis85: Thx, não sabia disso.
soulmerge

4

E se você quiser aplicar a tarefa de substituição recursivamente ? Como você faria isso?

Bem, eu mesmo encontrei a resposta. Não é a solução mais elegante (também tenta renomear arquivos que não atendem à condição), mas funciona. (BTW, no meu caso eu precisei 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

2

Tente algo assim, supondo que todos os seus arquivos sejam .txt:

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

2
obteve o erro abaixo tr: duas strings devem ser fornecidas ao traduzir mv: argumento de arquivo ausente Tente `mv --help 'para mais informações.
Mithun Sreedharan

2
Erro Agin tr: muitos argumentos Tente tr --help' for more information. mv: missing file argument Try mv --help 'para obter mais informações.
Mithun Sreedharan

2

Aqui está outra solução:

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

1

Cite suas variáveis:

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

Remova o "eco" para fazer a renomeação real.


Ele está ecoando os comandos mv corretamente, mas não está realmente renomeando o arquivo!
Mithun Sreedharan

remover o echo produz um erro como mv: não é possível stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': Não existe esse arquivo ou diretório mv: não é possível stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': Nenhum arquivo ou diretório
Mithun Sreedharan

Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP Sex. 14 de agosto 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

A maneira mais fácil de substituir uma string (caractere de espaço no seu caso) por outra string Linuxé usando sed. Você pode fazer da seguinte maneira

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

Espero que isto ajude.


Isso não responde à questão.
Amit


0

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

Saída de amostra,

$ 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.