Alterar vários nomes de arquivos, substituindo um caractere

23

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

Como posso substituí-lo?

    
por user236152 16.01.2014 / 12:03

8 respostas

45

Em um terminal, cd no diretório correto e execute isso.

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

Isto irá pré-visualizar a renomeação. Ele deve substituir : por - .

Se isso parece certo, remova o n do final e, em seguida, ele fará a renomeação real.

    
por Oli 16.01.2014 / 12:06
9

Aqui está uma solução pura:

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

O formato ${var//pattern/replacement} substituirá todas as ocorrências de pattern por replacement na 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, pode simplesmente colocá-los em uma classe de caracteres. Por exemplo, para substituir todos os ; , : , = , + , % , , 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 [ ] significa any of the characters listed . Então, colocando todos os caracteres que você deseja substituir na classe de personagem, todos eles são tratados de uma só vez.

Para os caracteres específicos que você pediu, as coisas são um pouco mais complexas porque alguns deles precisam ser escapou (estou ignorando o / , já que * nix não permite nomes de arquivos mais do que o Windows faz isso não será um problema):

$ 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

Observe que escapei de \ , ' e " adicionando um \ na frente de cada um.

    
por terdon 16.01.2014 / 14:36
1

Se você preferir uma GUI, instale o pyrenamer:

sudo apt-get install pyrenamer

Em seguida, execute:

pyrenamer

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

    
por animaletdesequia 16.01.2014 / 12:38
1

Prefiro GUI , mas como extensão do Nautilus, ou seja, Ações do Nautilus extras :

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

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

Então, quando você selecionar os arquivos a serem renomeados e clicar em Renomear no menu de contexto, você terá muitas opções para renomear arquivos.

    
por Sadi 16.01.2014 / 14:27
0

O pacote renameutils tem um programa prático chamado qmv , que fornece renomeação em lote interativa. Você o executa em um diretório ou em uma lista de arquivos, e gera um arquivo de texto temporário contendo seus nomes de arquivo e inicia seu editor favorito. Quando você sai do editor, qualquer nome de arquivo alterado é renomeado de acordo. qmv transforma 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 comando :%s/:/_/g no Vim (ou uma pesquisa e substituição correspondentes no editor que você usa).

A opção -f do define o formato do arquivo de texto para ter apenas o nome do arquivo de destino, o que simplifica a pesquisa e a substituição. O formato padrão tem duas cópias do nome do arquivo em cada linha e você edita apenas o segundo. Isso permite fazer a coisa certa se você tiver excluído ou reordenado linhas no arquivo, mas nem sempre é o mais fácil. Existem outros formatos também.

Com qmv , você pode optar por enviar o arquivo gerado por meio de um comando de sua escolha, como sed , se não quiser o recurso interativo.

    
por Dan Hulme 16.01.2014 / 17:52
0

E aqui está um Nautilus Script que substitui (todos?) os caracteres incompatíveis com o Windows com 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 "" | sed 's/ /\?/g''
        filesall="$files $filesall"
        shift
    done
for i in $filesall; do mv "$i" "${i//[<>:\|*\'\"?]/-}"; done
    
por Sadi 17.01.2014 / 16:25
0

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

Instalar 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 )

    
por user154126 22.01.2014 / 13:15
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
    
por TekWiz2010 21.12.2015 / 06:10