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

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

Olá, tenho vários arquivos com espaços no nome. Existe uma maneira de transferi-los para novos arquivos sem espaços. Por exemplo, tenho o arquivo Hello World.pdf e quero movê-lo para Hello_World.pdf. Obviamente, para um arquivo, posso usar o comando mv, mas quero fazer isso com todos os arquivos de uma pasta.

Obrigado

Responder1

Você pode usar otrousedcomandos para isso:

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

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

newname=`echo $file | tr ' ' _`

Responder2

Aqui estão alguns scripts que 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 corrige recursivamente todos os nomes no diretório atual. Observe que ainda será necessário algum trabalho se os nomes dos diretórios 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

Responder3

se você tiver bash, não há necessidade de chamar ferramentas externas

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

informação relacionada