Alterar vários nomes de arquivos substituindo um caractere


29

Eu tenho vários arquivos nomeados como o that : screenshot 13:25.png
Windows, para tentar abrir esses arquivos provavelmente por causa do ":".

Como posso substituí-lo?


2
Você pode aceitar uma resposta para marcar a pergunta como resolvida? Isso ajudará muito outros usuários.
MERose

Respostas:


52

Em um terminal, cdno diretório certo e execute-o.

rename 's/\:/-/g' *.png -vn

Isso visualizará a renomeação. Deve substituir :por -.

Se isso parecer correto, remova o ndo final e ele fará a renomeação real.

Nota : As versões do Ubuntu acima do 17.04 não são fornecidas rename, mas ainda estão disponíveis nos repositórios padrão, então use-as sudo apt install renamepara obtê-las


O problema é que o padrão de substituição não foi finalizado na linha 1. (eval 1) 1.
user236152

@ user236152 Desculpe, fiquei um pouco louco com as barras invertidas que escapavam (estava no piloto automático!). Removido um casal e deve ser válido agora.
Oli

Talvez um script Nautilus simples que substitua todos os caracteres que possam causar problemas em outras plataformas (executando em todos os arquivos selecionados) possa ser útil para pessoas "multiplataforma".
Sadi

2
Por que usar isso? Ele mostra o que está fazendo (facilita a reversão se você cometer um erro). Por que no final? Apenas para que você possa removê-lo (ou o n) facilmente.
Oli

1
@nightcrawler Você deve conseguir encadear substituições completamente separadas:rename 's/\:/-/g; s/%28/ /g; s/%29//g' ...
Oli

10

Aqui está uma solução pura do bash:

for i in *:*; do
    mv "$i" "${i//:/_}"
done

O ${var//pattern/replacement}formato irá substituir todas as ocorrências patterncom replacementna variável $var. Para obter mais informações sobre os recursos de manipulação de string do bash, consulte aqui .

Se você quiser fazer isso para vários caracteres, basta colocá-los em uma classe de caracteres. Assim, por exemplo, para substituir todos ;, :, =, +, %, ,com sublinhados, você poderia fazer:

$ ls 
1foo:bar  2foo:bar:baz  3foo;bar  4foo=bar  5foo%bar  6foo,bar  7foo+bar
$ for i in *; do mv "$i" "${i//[:;=%,+]/_}"; done
$ ls
1foo_bar  2foo_bar_baz  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar

Basicamente, a ideia é que isso [ ]significa any of the characters listed. Portanto, colocando todos os caracteres que você deseja substituir na classe de personagens, todos eles são tratados de uma só vez.


Para os caracteres específicos que você solicitou, as coisas são um pouco mais complexas, porque algumas precisam ser escapadas (estou ignorando o fato de o /* nix não permitir isso em nomes de arquivos mais do que o Windows, para que não seja um problema. questão):

$ ls
1foo<bar  2foo>bar  3foo:bar  4foo\bar  5foo|bar  6foo*bar  7foo?bar  8foo"bar  9foo'bar
$ for i in *; do mv "$i" "${i//[<>:\\|*\'\"?]/_}"; done
$ ls
1foo_bar  2foo_bar  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar  8foo_bar  9foo_bar

Note que eu escapei o \, 'e "adicionando um \na frente de cada um.


Isso pode ser aprimorado para substituir vários caracteres individuais (por exemplo, todos aqueles que não são aceitáveis ​​pelo Windows) por outros?
Sadi

1
@Sadi veja resposta atualizada.
terdon

Basicamente, existem nove: "<>:" / \ | ? * "
Sadi 16/01

@Sadi veja resposta atualizada.
terdon

Obrigado, isso poderia ajudar a criar um Script Nautilus que torna os nomes dos arquivos selecionados compatíveis com o Windows.
Sadi

2

Se você preferir uma GUI, instale o pyrenamer:

sudo apt-get install pyrenamer

Em seguida, execute-o:

pyrenamer

Possui dezenas de opções para padrões e formatos de renomeação.


1

Eu prefiro a GUI, mas como uma extensão do Nautilus, ou seja, ações extras do Nautilus :

sudo add-apt-repository ppa:nae-team/ppa
sudo apt-get update
sudo apt-get install nautilus-actions-extra
nautilus -q

(Consulte www.webupd8.org/2011/12/nautilus-actions-extra-pack-of-useful.html )

Em seguida, quando você seleciona arquivos a serem renomeados e clica em Renomear no menu de contexto, são oferecidas muitas opções para renomear arquivos.


0

O renameutilspacote possui um programa útil chamado qmvque fornece renomeação em lote interativa. Você o executa em um diretório ou lista de arquivos, e ele gera um arquivo de texto temporário contendo os nomes dos arquivos e inicia o seu editor favorito. Quando você sai do editor, todos os nomes de arquivos alterados são renomeados de acordo. qmvtransforma um problema de renomeação em lote em um problema de edição de texto.

Nesse caso, você pode usar qmv -f do *:*para editar os nomes de todos os arquivos que contêm dois pontos e, em seguida, o :%s/:/_/gcomando no Vim (ou uma pesquisa e substituição correspondente em qualquer editor que você use).

A -f doopção define o formato do arquivo de texto para ter apenas o nome do arquivo de destino, o que simplifica a pesquisa e substituição. O formato padrão possui duas cópias do nome do arquivo em cada linha e você edita apenas a segunda. Isso permite que você faça a coisa certa se você excluiu ou reordenou as linhas no arquivo, mas nem sempre é o mais fácil. Existem outros formatos também.

Com qmv, você pode optar por canalizar o arquivo gerado através de um comando de sua escolha, como sed, se não desejar o recurso interativo.


0

E aqui está um script do Nautilus que substitui (todos?) Caracteres incompatíveis com o Windows por um hífen em todos os nomes de arquivos selecionados (com base na resposta de terdon ;-)

#!/bin/bash
filesall=""
while [ $# -gt 0 ]
    do
        files=`echo "$1" | sed 's/ /\?/g'`
        filesall="$files $filesall"
        shift
    done
for i in $filesall; do mv "$i" "${i//[<>:\\|*\'\"?]/-}"; done

0

O Thunar (o gerenciador de arquivos XFCE) possui um bom recurso para renomear arquivos em massa. Possui opções para remover / substituir caracteres, pesquisar e substituir, numerar arquivos e muito mais.

Instale o thunar:

sudo apt-get install thunar

Abra o thunar, navegue até seus arquivos, selecione-os e escolha 'renomear' (via menu de contexto ou F2)


0
@echo off
echo.
echo. How many Characters Do You Want To Remove
echo.
echo. From The End Of The FileName ?
echo.
echo.
set /p variable=" > "
setlocal enabledelayedexpansion
for /f "delims=" %%a in (' dir /b /a-d *.mp3') do (
set oldName=%%a
Set newName=!oldName:~0,-%variable%!.mp3
Ren "!oldName!" "!newName!"
)
exit

Isso funciona bem e tem um prompt de variável ... Nomeie o arquivo com algo como _ Truncar Últimos Personagens.cmd
TekWiz2010

3
Embora isso possa estar correto, ele usa uma linguagem de script em lote do Windows. Estamos no AskUbuntu, um site para perguntas relacionadas ao Ubuntu e, portanto, ferramentas relacionadas ao Ubuntu. Minha opinião é que essa resposta pode não ser necessariamente apropriada aqui.
Sergiy Kolodyazhnyy

Você precisaria executá- lo no Wine, mas provavelmente é possível executá-lo no Ubuntu ... É apenas uma resposta estranha, é tudo.
Oli
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.