Eu estava procurando uma maneira de renomear um grande número de arquivos com nomes semelhantes, assim como este (uma questão relacionada ao Windows), exceto pelo fato de estar usando o * nix (Ubuntu e FreeBSD, separadamente). Para resumir, enquanto uso o shell (Bash, CSH etc.), como renomeio em massa vários arquivos, como, por exemplo, os seguintes arquivos:
Beethoven - Fur Elise.mp3
Beethoven - Sonata ao luar.mp3
Beethoven - Ode à Joy.mp3
Beethoven - Raiva pela perda de um centavo.mp3
será renomeado como estes?
Fur Elise.mp3
Moonlight Sonata.mp3
Ode à Joy.mp3
Raiva sobre a moeda perdida.mp3
A razão pela qual eu quero fazer isso é que essa coleção de arquivos irá para um diretório chamado "Beethoven" (ou seja, o prefixo dos nomes dos arquivos) e ter essas informações no nome do arquivo será redundante.
Como muitas coisas no Linux / Unix, há mais de uma maneira de fazer isso!
Alguns podem usar mmv (massa mv).
O comando rename ou prename que vem com alguns pacotes Perl (Ubuntu e Debian mais recentes) também pode fazer isso.
Observe que a ferramenta de renomeação no Fedora 10 não é o mesmo programa e funciona de maneira diferente. Faz parte de um pacote diferente, util-linux-ng, e pode ser encontrado aqui .
Costumo ir ao shell em busca de um hábito (depois de todas essas ferramentas nem sempre existirem).
Isso criará o diretório Beethoven e, em seguida, mova o arquivo para esse diretório / nome do arquivo, onde o nome do arquivo tem o "Beethoven -" substituído por nada.
Como teste, antes:
Depois de:
fonte
Experimente esta solução, implementada usando uma combinação de grep e renomear. Isso pressupõe que você tenha vários diretórios que precisam renomear. Se houver apenas alguns, eu adotaria a abordagem manual, com o padrão "Artista -" codificado para cada um.
Explicação da localização :
O comando find localiza todos os arquivos com extensão .mp3 na hierarquia de arquivos atual e chama o argumento passado para -exec para cada um. Observe que dentro de -exec , {} refere-se ao argumento transmitido por find (caminho do arquivo + nome). Os
\;
garante a;
é passado para mudar o nome e, em vez de indicar o fim da descoberta de comando.O comando fornecido acima possui a opção -n (sem ação); portanto, ele só dirá o que aconteceria se você o executasse. Eu recomendo que você execute este comando sem a opção -n somente depois de executá-lo uma vez e ficar satisfeito com os resultados propostos.
Agora para o regexp.
^
corresponde ao início da string.$
corresponde ao final da sequência..
corresponde a qualquer caractere.*
significa zero ou mais da construção anterior. por exemplo,.*
significa zero ou mais caracteres.\s
significa qualquer caractere de espaço.\S
significa qualquer caractere não espacial.()
é capturado e reflecte-se como$1
,$2
de acordo com a sua posição.O regexp:
(.*/)
-
":.*-
(.*)
Aqui está o meu teste:
Os negócios da Regexp são complicados e eu cometi muitos erros ao escrevê-los, por isso gostaria de receber qualquer opinião sobre a falta de mérito deste. Eu sei que encontrei alguns testando isso.
fonte
Eu montei um programa Java de linha de comando que facilita a renomeação de arquivos (e diretórios), especialmente para scripts. É gratuito e de código aberto, para que você possa modificá-lo para o conteúdo do seu coração:
RenameWand
http://renamewand.sourceforge.net/
Alguns exemplos de uso relevantes:
Mova os arquivos do formulário
"<a> - <b>"
para o respectivo diretório"<a>"
:Classifique os arquivos pela hora da última modificação e renomeie-os com um número de 3 dígitos:
Reorganize partes do nome do arquivo e altere maiúsculas e minúsculas:
fonte
zmv
A ferramenta de renomeação do zsh é muito boa.Mais notas aqui ...
fonte
Para as cabeças do Penguin, isso é feito facilmente em um shell script ou AWK. Para nós, meros mortais, você pode tentar o Midnight Commander. Está na maioria das distribuições Linux, a partir de um prompt do shell, digite mc -a. Você pode renomear arquivos usando expressões regulares. Usei o artigo em GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/ para me ajudar.
fonte
Aqui está um exemplo simples da linha de comando. Eu tinha a palavra "branco" no meio dos nomes de um monte de arquivos png. Eu queria retirá-lo e deixar apenas um único sublinhado. Isso fez o truque:
fonte
Use o vidir e, em seguida, use os recursos do editor para aplicar o padrão de renomeação.
fonte
Em um * nix sem perl
rename
disponívelEm alguns * nix, não há renomeação disponível; portanto, é necessário fazer a renomeação usando outro método. Alguns anos atrás, sugeri
zmv
aqui que, embora ótimo, também não está necessariamente disponível.Usando builtins e sed, podemos rapidamente criar um script de shell para fazer isso, o que nos dá uma sintaxe muito semelhante ao script de renomeação do perl, enquanto falta alguma gentileza no tratamento de erros, ele faz o trabalho.
Uso
Digamos que também desejássemos criar pastas de destino ...
Como
mv
não cria pastas que não podemos usarsedrename
como está aqui, mas é uma mudança bastante pequena, então acho que seria bom incluí-la também.Precisamos de uma função de utilitário
abspath
(ou caminho absoluto) para podermos gerar a (s) pasta (s) de destino para um padrão sed / renomear que inclua nova estrutura de pastas.Isso garantirá que sabemos os nomes de nossas pastas de destino. Quando renomeamos, precisamos usá-lo no nome do arquivo de destino.
Aqui está o script ciente da pasta completa ...
Obviamente, ele ainda funciona quando não temos pastas de destino específicas também.
Se quisermos colocar todas as músicas em uma pasta,
./Beethoven/
podemos fazer o seguinte:Uso
Rodada de bônus ...
Usando este script para mover arquivos de pastas para uma única pasta:
Supondo que desejássemos reunir todos os arquivos correspondentes e colocá-los na pasta atual, podemos fazê-lo:
Nota sobre padrões de regex sed
As regras regulares de padrões sed aplicam-se neste script, esses padrões não são PCRE (expressões regulares compatíveis com Perl). Você pode ter usado a sintaxe da expressão regular estendida, usando
sed -r
oused -E
dependendo da sua plataforma.Consulte o compatível com POSIX
man re_format
para obter uma descrição completa dos padrões de regexp básicos e avançados sed.fonte