2012-06-26 7 views
14

Sto cercando un comando bash per trovare i file con spazi finali alla fine di ogni riga. Non sono interessato a rimuovere gli spazi, ma solo a trovare i file.Bash: trova i file con spazi finali alla fine delle righe

+2

Nota: Anche se la formulazione della domanda (al momento della stesura) richiama in modo inequivocabile per la ricerca di file con gli spazi finali su _each e ogni linea_, l'inusualità di questo requisito ha portato ad alcune risposte, in particolare quella con i voti più alti, trovando invece file con uno o più righe con spazi finali. – mklement0

+0

nome file -n '/ \ + $/p' – Luv33preet

risposta

1

Trova file con uno o più caratteri finali abitabile:

find . -name "*" | xargs egrep ".* +$" 
+0

Credo che la domanda iniziale fosse trovare i file che hanno spazi finali su TUTTE le linee. Potrebbe essere solo una brutta formulazione in origine, però. – Nit

+0

@Nit dice chiaramente nel corpo, deve averlo perso, ma l'intestazione della domanda può essere ambigua. – matcheek

+0

L'espansione sulla tua soluzione, però, 'egrep -m1 -v -l". * + $ "' Dovrebbe trovare tutti i file che ** non ** hanno spazi finali su ogni riga, se non sbaglio? – Nit

25

trovare i file che ha finali spazi.

find . -type f -exec egrep -l " +$" {} \; 
+0

Mentre puoi fare fare con solo 'grep', come hanno dimostrato altre risposte, usare' find' potrebbe essere ancora una buona idea, se vuoi avere più controllo su quali file esaminare., Puoi rendere il comando 'find' molto più efficiente usando' + 'invece di' \; 'per terminare il primario' -exec' - invocherà 'egrep' (in genere) solo _once_, con tutti i nomi dei file. – mklement0

+0

Si noti che questa risposta trova i file con _almeno 1_ riga con tra spazi di iling. Questo può sicuramente essere utile ed è probabilmente il caso d'uso più comune, ma non è quello che l'OP chiedeva (almeno come implicito nel loro testo "alla fine di _each_ line"). – mklement0

8

Se l'obiettivo è quello di elencare i file che sono trailing spazi bianchi in una o più linee:

grep -r '[[:blank:]]$' . 

Per non stampare le righe, e solo stampare solo i nomi dei file, specificare anche l'opzione -l . Quello è l come nella parola list, non il numero 1.

+1

la domanda dice "alla fine di ** ogni ** riga" – Sorin

+1

@Sorin, ho intenzione di indovinare che non era proprio l'intenzione dell'OP, ma ammetterò che la domanda in realtà lo dice, presa alla lettera .. – twalberg

+0

@twalberg, è ciò che lo rende una domanda non banale, che varrebbe la terza risposta quasi identica – Sorin

1

C'è un'opzione per elencare i file che non contengono una corrispondenza in alcun punto; usa quello e una regex per un personaggio diverso da uno spazio poco prima del termine della riga.

grep -L '[^ ]$' * 

Per recurse directory, aggiungere -r. Per cercare altri caratteri di spazi bianchi, utilizzare una classe di caratteri $'[^ \t]$' o POSIX '[^[:blank:]]$' per l'espressione regolare.

+0

Ben fatto. In realtà restituisce solo file TUTTE le cui linee hanno spazi finali - con una sola eccezione: anche i file _empty_ (zero-byte) sono abbinati. Inoltre, l'utilizzo di '*' (senza '-r') comporterà degli avvisi per le sottodirectory, se presenti. '-L' non è compatibile con POSIX, ma ampiamente supportato, dato che sia GNU grep che BSD sed lo implementano. – mklement0

+1

@ mklement0 Un bel problema con i file di dimensioni zero. Puoi usare '-s' per sopprimere gli avvertimenti sulle directory, o usare' -r .' se vuoi attraversare un intero albero di directory (l'OP non era specifico sull'attività). – tripleee

0

Se la domanda è letteralmente a trovare i file che hanno un vuoto alla fine di ogni singola linea, allora questo dovrebbe funzionare:

grep -rL '[^[:blank:]]$' . 

Il -L dice grep segnalare ogni file che non corrisponde al modello e il pattern sta cercando linee che non hanno uno spazio immediatamente precedente alla newline.

0

Utilizzando ack (o ag):

ack -l ' \n' 

Nota: Come alcune delle altre risposte, questo sarà elencare i file che contengono uno o più linee con spazi finali.

1

Se l'obiettivo è quello di file di elenco con spazi finali nel percorso corrente:

grep -rli '[[:blank:]]$' . 
Problemi correlati