como alterar as extensões de arquivo em um diretório [closed]

4

Eu tenho muitos arquivos em um diretório com extensão.

.text(2)
.text(1)

Eu quero remover os números da extensão e a saída deve ser como

.text 
.text

Alguém pode me ajudar com o shell script para isso? Estou usando o CentOS 6.3.

    
por vishal 10.06.2015 / 09:33

4 respostas

8

Inicie o one-liner na pasta onde os arquivos são salvos ou altere o caminho para o comando find . Nos exemplos a seguir, find . o caminho é . (ponto).

Teste com:

find . -type f -print0 | xargs -I{} -0 rename -v -n  's/\([0-9]+\)$//' {}

Renomeie com:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}

O comando localiza todos os arquivos recursivamente e remove todas as ocorrências de (<any_number>) no final do nome do arquivo.

Remova o $ em 's/\([0-9]+\)$//' para remover todas as ocorrências em algum lugar no nome do arquivo, por exemplo:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)//' {}

Exemplo:

% ls -oga
-rw-rw-r--  1 0 Jun 10 09:34 .foo(1)
-rw-rw-r--  1  0 Jun 10 09:34 .bar(2)
% find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}
% ls -aog
-rw-rw-r--  1    0 Jun 10 09:34 .foo
-rw-rw-r--  1    0 Jun 10 09:34 .bar
    
por A.B. 10.06.2015 / 09:41
0
for i in *.text*; do mv "$i" "$(echo "$i" | sed 's/([0-9]\{1,\})$//')"; done 

só precisa alterar a extensão (.text ou qualquer outra extensão) de acordo com a necessidade.

    
por vishal 10.06.2015 / 13:43
0

Usando python :

#!/usr/bin/env python2
import os, re
for root, dirs, files in os.walk('/path/to/directory'):
    for f in files:
        oldname = os.path.join(root, f)
        newname = os.path.join(root, re.search(r'(?<=/)[^/]+(?=\(\d+\)$)', oldname).group())
        os.rename(oldname, newname)

Considerando que a primeira parte dos nomes dos arquivos é diferente (como você já mencionou), não há chance de sobrescrever.

  • os.walk irá percorrer todos os subdiretórios no diretório mencionado

  • oldname conterá o nome do arquivo a ser alterado. os.path.join adicionará o nome do arquivo ao caminho do diretório por os.path.join

  • newname conterá o nome para o qual oldname será alterado. Aqui, usamos o módulo re para obter o nome do arquivo e, em seguida, adicionamos o nome do arquivo ao caminho do diretório por os.path.join

  • os.rename simplesmente renomeará os arquivos de acordo.

Antes:

foo
├── 1 spam.text(1)
├── 1.text(23)
└── bar
    ├── 1 egg.text(10)
    └── 3test.text(5)

Depois:

foo
├── 1 spam.text
├── 1.text
└── bar
    ├── 1 egg.text
    └── 3test.text
    
por heemayl 10.06.2015 / 14:04
-1

Este é um "comentário adicional" e não uma resposta completa por si só.

Este é um modo muito longo de 'explicar' um conceito menor - ele parecerá longo e pedante, exceto se o leitor não entender o assunto.

Breve resumo:

Se houver mais de um arquivo de nome como foo.txt [(n)]

  • foo.txt, foo.txt (1) - renomear - > nenhuma mudança
    Parece que nada aconteceu. Fez.

  • foo.txt (1), foo.txt (2) - renomear - > foo.txt, foo.txt (2) (provavelmente)
    Um arquivo foi renomeado, um não.

Mais longo:

Você diz que não tem arquivos duplicados.
Você pode estar correto
MAS - o seguinte é trivialmente óbvio, se você conhece, mas uma armadilha sutil, se você não tiver encontrado antes.

No que diz respeito ao sistema

foo.txt = = foo.txt (1) = = foo.txt (2) = etc

independentemente do conteúdo ou tamanho do arquivo.

ie Se você tem dois nomes de arquivos foo.txt com ou sem (n) depois deles, o sistema pensa que eles são duplicados e / ou são duplicados.
De qualquer maneira, um processo de renomeação falhará.

Se o processo de renomeação criar dois arquivos com o mesmo nome, ele falhará quando for feita a tentativa de criar a primeira duplicata. Mas

Em um caso, a falha não criará nenhuma saída, de modo que parecerá que "nada aconteceu" quando realmente ocorreu "cópia falhada devido à colisão de nomes". Este caso ocorre quando um arquivo não tem nenhum (n) sufixo e outro tem.
por exemplo, se os arquivos existentes forem foo.txt e foo.txt (1), a renomeação de foo.txt (1) criaria uma duplicata se permitida, portanto, não ocorrerá e, portanto, nenhuma ação ocorrerá.
foo.txt, foo.txt (1) - > sem alteração

Mas se os arquivos existentes forem, por exemplo, foo.txt (1) e foo.txt (2), então a renomeação de foo.txt (1) NÃO criará uma duplicata, assim ocorrerá, MAS a renomeação de foo.txt (2) subsequentemente criaria uma duplicata se permitida para que nenhuma ação de renomeação de segundo arquivo ocorrerá.
foo.txt (1), foo.txt (2) - > foo.txt, foo.txt (2) (provavelmente)

    
por Russell McMahon 10.06.2015 / 13:35