Aggiungi testo ai nomi dei file che non contengono un punto


9

Dati i seguenti file:

english_api
english_overview
style.css

Voglio ottenere:

english_api.html
english_overview.html
style.css

In altre parole, come aggiungere un testo a tutti i file che non contengono un punto ( .) all'interno di una directory usando il terminale.

Ovviamente ci sono molti file in quella cartella; Ho appena scritto 3 come esempio.

Se dovessi, diciamo, sostituiscilo .csscon .htmlquella cartella, userei:

rename .css .html *.css

Ma non riesco davvero a pensare a un modo per abbinare i file che non contengono qualcosa. Inoltre, come aggiungere (vs sostituire) usando il renamecomando?

Risposte:


13

Prova questo findcomando,

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

Rinomina i file che non contengono punti nei loro nomi di file presenti nella directory corrente in questo filename.htmlformato ( aggiunto .htmlalla fine ).

. -> Rappresenta la directory corrente

-type f -> Per eseguire questa operazione solo sui file.

! -name "*.*" -> stampa il nome dei file che non hanno punti nel loro nome.

-exec mv {} {}.html -> findcomando esegue questa operazione di spostamento (o) rinomina sui nomi dei file estratti.

\; -> Rappresenta la fine del findcomando.


6

In bash, potresti usare globs di guscio estesi ad es

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

(rimuovi echouna volta che hai confermato che corrisponde al modello corretto). Se il globbing esteso non è già abilitato, è possibile abilitarlo con shopt -s extglob.

Un'altra opzione sta usando la renamefunzione basata su perl con una regex che esclude letterale.

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

(rimuovere l' nopzione dopo aver verificato che corrisponde allo schema corretto).


for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; doneil comando rinomina anche le directory.
Avinash Raj,

2

Il mio preferito in casi come questo è mmv. Non è installato di default in Ubuntu, ma puoi installarlo usando il sudo apt-get install mmvcomando.

Nel tuo caso devi usarlo due volte:

  1. Rinomina tutti i file dalla directory corrente aggiungendo .htmlalla fine di ogni nome di file:

    mmv -v '*' '#1.html'
    
  2. Rinomina di nuovo (indietro) tutti i file che avevano precedentemente nei loro nomi uno o più .(punti):

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

Oppure, in una riga:

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

-vl'opzione non è obbligatoria. Lo uso solo per un output dettagliato perché senza di esso mmvesegue le azioni in silenzio.

Vedi man mmvper maggiori informazioni.


1

Con il comando Perl rename ( prename), è possibile aggiungere una condizione che il nome del file deve contenere un punto. Se lo snippet Perl non cambia il nome di un file, quel file non viene modificato. Ecco alcuni modi per scrivere questo:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *

-2

Le risposte sono perfette, ti do anche un altro comando che fa questo lavoro:

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

Qualche spiegazione:

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 :

Provo il tuo scenario e il comando fa il lavoro.


6
Ciò non riesce sui nomi dei file che contengono qualsiasi tipo di spazio bianco (spazi, tabulazioni, newline ecc.). Come regola generale, non dovresti mai analizzarels .
terdon,

Proprio così grazie per il tuo commento, ma come posso risolverlo con lo stesso comando
nux

3
Non puoi davvero. Non esiste quasi alcun modo sicuro per analizzare ls. Se vuoi davvero farlo usando awke sh, prova qualcosa di simile printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. Ciò si interromperà ancora sui nomi dei file con le nuove righe ma almeno può occuparsi degli spazi. Il --che serve per i casi in cui si hanno i nomi di file che iniziano con -.
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.