Linux - Substituindo espaços nos nomes dos arquivos

96

Tenho vários arquivos em uma pasta e desejo substituir cada caractere de espaço em todos os nomes de arquivo por sublinhados. Como posso conseguir isso?

Mithun Sreedharan
fonte

Respostas:

172

Isso deve servir:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
neesh
fonte
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" *
DF.
fonte
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.

DigitalRoss
fonte
4

Se você usar o bash:

for file in *; do mv "$file" ${file// /_}; done
Murali VP
fonte
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
Javipas
fonte
2

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

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
Amir Afghani
fonte
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
Yoogottamk
fonte
1

Cite suas variáveis:

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

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

ghostdog74
fonte
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.

Desta Haileselassie Hagos
fonte
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
Akilesh Raj
fonte