Remover pontos duplicados do nome do arquivo

1

Eu tenho um diretório com vários arquivos dentro dos quais foram nomeados malformados, como file..txt , file2..txt , etc ...

Então, como remover facilmente este segundo . dos nomes dos arquivos?

Qualquer método aplicável é apreciado, incluindo awk, sed, grep, etc ...

    
por Maythux 02.07.2015 / 12:29

7 respostas

5

Usando rename (de acordo com a sugestão de heemayl, reduzi o globbing apenas para nomes de arquivos que terminam exatamente com ..txt ):

rename -n 's/(.*)\./$1/' *..txt

Isso corresponderá ao nome do arquivo até o último ponto e substituirá a correspondência por tudo menos o último ponto.

Se o resultado for o esperado, remova a opção -n :

rename 's/(.*)\./$1/' *..txt
    
por kos 02.07.2015 / 12:35
4

Outro rename variante:

rename 's/\Q.././' *..txt

usando \Q evita escapar dos pontos (consulte link )

    
por Sylvain Pineau 02.07.2015 / 12:56
4

Eu tenho uma solução de trabalho, ainda trabalhando para melhor:

for f in *; do mv $f ${f%.txt}txt; done

Agradecemos a @heemayl nota:

Rather than using *, use *..txt to get the files as only * will cause problem when you have any file without . and with only one

Então se torna:

for f in *..txt; do mv $f ${f%.txt}txt; done
    
por Maythux 02.07.2015 / 12:33
2

Você pode tentar a ordem inversa. Isso funciona se o nome do arquivo contiver caracteres de nova linha.

rename 's/\.([^.]+)$/$1/' *..txt
    
por Avinash Raj 02.07.2015 / 13:27
2

A maneira muito simples de fazer isso, basta executar o seguinte comando dentro do diretório que contém os nomes de arquivos no formato u mencionado acima

rename 's/\.+txt/\.txt/' *
    
por jerry 03.07.2015 / 13:23
1

Os nomes dos arquivos podem conter um caractere de nova linha, portanto:

find . -maxdepth 1 -type f -print0 | while read -d $'
$ find -exec  printf "%s ---" {} \;
. ---./foo
..txt ---./foo..txt ---

$ find . -maxdepth 1 -type f -print0 | \
    while read -d $'
find . -maxdepth 1 -type f -print0 | while read -d $'
$ find -exec  printf "%s ---" {} \;
. ---./foo
..txt ---./foo..txt ---

$ find . -maxdepth 1 -type f -print0 | \
    while read -d $'%pre%' f; do mv "$f" "${f%.txt}txt"; done

$ find -exec  printf "%s ---" {} \;
. ---./foo
.txt ---./foo.txt ---
' f; do mv "$f" "${f%.txt}txt"; done
' f; do mv "$f" "${f%.txt}txt"; done $ find -exec printf "%s ---" {} \; . ---./foo .txt ---./foo.txt ---
' f; do mv "$f" "${f%.txt}txt"; done

Exemplo

%pre%     
por A.B. 02.07.2015 / 13:27
1

Isso funciona muito bem se não houver arquivos com um único ponto:

for file in *; do mv "$file" "${file%%.*}${file#*.}"; done
    
por Sergiy Kolodyazhnyy 02.07.2015 / 13:30