Como renomeio arquivos com espaços usando o shell do Linux?

25

Eu nomeei vários arquivos com espaços neles e quero substituir o espaço por _ . No entanto, toda vez que escrevo um comando no shell com o nome do arquivo (por exemplo, Spring 2011 ), o shell não reconhece o arquivo ou diretório.

O que posso fazer sobre isso? Existe alguma maneira de usar o caractere unicode para um espaço?

    
por Phil Braun 08.06.2011 / 21:38

5 respostas

32

Escape do espaço, por ex. Spring\ 2011 ou use aspas, por exemplo %código%. No futuro, normalmente é uma má idéia usar nomes de arquivos com espaços neles em qualquer * NIX.

Se você tem 'Spring 2011' , pode usar isto:

rename ' ' '_' [filenames...]
    
por 08.06.2011 / 21:40
28

Se a sua máquina tiver o comando renomear , isso alterará todos os espaços para sublinhados em todos os arquivos / dirs no diretório de trabalho atual:

rename 's/ /_/g' *
    
por 08.06.2011 / 21:42
21

Se você não tem rename ou prefere usar apenas o shell:

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

Detalhado:

  • *\ * seleciona todos os arquivos com um espaço em seu nome como entrada para o loop for .
  • As aspas em torno de "$f" são importantes porque sabemos que há um espaço no nome do arquivo e, do contrário, elas apareceriam como 2+ argumentos para mv .
  • ${f//str/new_str} é um recurso de substituição de string específico do bash. Todas as instâncias de str são substituídas por new_str .
por 22.06.2011 / 18:58
3

mv "Spring 2011.file" Spring_2011.file deve informar a linha de comando para usar a string entre aspas como uma única entrada.

    
por 08.06.2011 / 21:42
0

Para renomear programaticamente N arquivos, você pode usar um simples bash para loop.

#!/bin/bash

set -eux

# find all your files by using a 'grep' pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here

# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS

# for each filename
for filename in "${tmp[@]}"; do
    # rename the filename to use "_" character instead of a " " character
    mv -v "${filename}" "${filename// /_}"
done

Se você tem menos de 5 nomes de arquivos, então você pode digitar manualmente todos os nomes de arquivos e usar o comando rename como o acima solução sugere. Mas para mim ... eu prefiro a solução programática ... mesmo quando há apenas 4 arquivos.

p.s.

se você não estiver familiarizado com a Expansão de Parâmetro Bash (por exemplo, ${filename// /_} ), poderá usar o comando rename :

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi
    
por 03.10.2018 / 19:52