Substituir espaços em nomes de arquivos da linha cmd unix

5

Oi eu tenho um monte de arquivos com espaços no nome, existe uma maneira de mv-los para novos arquivos sem espaços. Por exemplo, eu tenho o arquivo Hello World.pdf eu quero movê-lo para Hello_World.pdf. Obviamente, para o arquivo que eu posso usar o comando mv, mas eu quero fazer isso para todos os arquivos em uma pasta.

Obrigado

    
por Aly 13.04.2010 / 13:12

3 respostas

9

Você pode usar os comandos tr ou sed para isso:

for file in *.pdf
do
    newname=$(echo $file | tr ' ' _)
    mv "$file" $newname
done

Observe que isso usa a mais nova sintaxe POSIX para a substituição de comandos: $ ( comando ).
Se você estiver usando um shell Bourne muito antigo, você precisará usar backticks:

newname='echo $file | tr ' ' _'
    
por 13.04.2010 / 13:23
3

Aqui estão alguns scripts que eu uso para esta tarefa:

#!/bin/ksh
# Name     : unspace - replace spaces by underscores in file names
# Usage    : unspace [file ...]
# Example  : unspace *.doc
unspace()
{
  ls "$@" | while a=$(line)
  do
    file=$(echo $a | grep " ")
    if [ -n "$file" ]
    then
      file="$(print "$file" | sed 's/ /_/g')"
      print "$a" "->" "$file"
      mv "$a" "$file"
    fi
  done
}
[[ "$(basename $0)" = unspace ]] && unspace "$@"

O seguinte está corrigindo recursivamente todos os nomes sob o diretório atual. Observe que ainda é necessário algum trabalho se os nomes de diretório também contiverem espaços incorporados.

#!/bin/ksh
find . |
  while a=$(line)
  do
          newName="$(print $a | tr ' ' '_')"
          if [ "$a" != "$newName" ]
          then
                  mv "$a" "$newName"
                  print $a moved
          else
                  print $a unchanged
          fi
  done
    
por 13.04.2010 / 18:31
0

se você tiver bash, não precisa chamar ferramentas externas

for file in *.pdf
do 
  if [ -f "$file" ];then
     echo mv "$file" "${file// /_}"
  fi
done
    
por 14.04.2010 / 03:02