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?
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?
Respostas:
Isso deve servir:
for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
for file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
*
para PATH_TO_YOUR_DIRECTORY
.
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" *
rename " " "_" *
rename
não disponível no OSX, parece.
rename
está disponível.
Use sh ...
for i in *' '*; do mv "$i" `echo $i | sed -e 's/ /_/g'`; done
Se quiser experimentar antes de puxar o gatilho, mude mv
para echo mv
.
Se você usar o bash:
for file in *; do mv "$file" ${file// /_}; done
mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try
mv --help 'para obter mais informações.
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.
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
Tente algo assim, supondo que todos os seus arquivos sejam .txt:
for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
tr --help' for more information. mv: missing file argument Try
mv --help 'para obter mais informações.
Aqui está outra solução:
ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
Cite suas variáveis:
for file in *; do echo mv "'$file'" "${file// /_}"; done
Remova o "eco" para fazer a renomeação real.
\'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
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.
Acredito que sua resposta está em Substituir espaços nos nomes de arquivos por sublinhados .
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
1 - foo.jpg
e minha pasta já tinha1.jpg
nele.