
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