Anexa texto a nomes de arquivos que não contenham um ponto

9

Dados os seguintes arquivos:

english_api
english_overview
style.css

Eu quero receber:

english_api.html
english_overview.html
style.css

Em outras palavras, como anexar um texto a todos os arquivos que não contêm um ponto ( . ) dentro de um diretório usando o terminal.

Obviamente, há muitos arquivos nessa pasta; Acabei de escrever 3 como exemplo.

Se eu fosse, digamos, substituir .css por .html nessa pasta, usaria:

rename .css .html *.css

Mas não consigo pensar em uma maneira de corresponder arquivos que não contêm algo. Também como acrescentar (vs substituir) usando o comando rename ?

    
por Bor691 19.05.2014 / 00:21

5 respostas

13

Tente este comando find ,

find . -type f ! -name "*.*" -exec mv {} {}.html \;

Ele renomeia os arquivos que não contêm pontos em seus nomes de arquivos presentes no diretório atual para este formato filename.html ( adicionado .html no último ).

. - > Representa o diretório atual

-type f - > Para fazer esta operação somente em arquivos.

! -name "*.*" - > imprima o nome dos arquivos que não possuem pontos em seus nomes.

-exec mv {} {}.html - > O comando find executa este movimento (ou) renomeia a operação nos nomes de arquivos extraídos.

\; - > Representa o final do comando find .

    
por Avinash Raj 19.05.2014 / 00:34
6

No bash, você poderia usar globs de shell estendidos , por exemplo

for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done

(remova o echo assim que confirmar que está combinando com o padrão correto). Se a globulação estendida ainda não estiver ativada, você poderá ativá-la com shopt -s extglob .

Outra opção é usar a função rename baseada em perl com uma expressão regular que exclui o literal .

rename -nv 's/^[^.]+$/$&.html/' path/to/files/*

(remova a opção n depois de confirmar que está combinando com o padrão correto).

    
por steeldriver 19.05.2014 / 00:53
2

O meu preferido em casos como este é mmv . Ele não é instalado por padrão no Ubuntu, mas você pode instalar usando o comando sudo apt-get install mmv .

No seu caso, você precisa usá-lo duas vezes:

  1. Renomeie todos os arquivos do diretório atual adicionando .html no final de cada nome de arquivo:

    mmv -v '*' '#1.html'
    
  2. Renomeie novamente (de volta) todos os arquivos que tinham anteriormente em seus nomes um ou mais . (pontos):

    mmv -v '*.*.html' '#1.#2'
    

Ou, em uma linha:

mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'
A opção

-v não é obrigatória. Eu o uso apenas para uma saída detalhada, porque sem ele mmv executa ações silenciosamente.

Veja man mmv para mais informações.

    
por Radu Rădeanu 19.05.2014 / 12:05
1

Com o comando renomear Perl ( prename ), você pode adicionar um condição que o nome do arquivo deve conter um ponto. Se o trecho de Perl não alterar o nome de um arquivo, esse arquivo será deixado intacto. Aqui estão algumas maneiras de escrever isso:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *
    
por Gilles 19.05.2014 / 09:11
-2

As respostas são perfeitas, eu também dou outro comando para você:

ls -1 | grep -v "\." | awk '{print "mv "$0" "$0".html"}' | sh

Algumas explicações:

ls - list directory contents

 -1     list one file per line

grep prints the matching lines.

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

Awk is mostly used for pattern scanning and processing. It searches one or more files to see if they contain lines that matches with the specified patterns and then perform associated actions.

NOTA:

Eu tento o seu cenário e o comando faz o trabalho.

    
por nux 19.05.2014 / 01:14