2013-01-17 7 views

risposta

2
for i in `find . -type f \(-name "*.c" -o -name "*.h" \)`; do sed -i 's/\r//' $i ; done 
+7

Si prega di non perpetuare [questa pratica orrenda] (http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29) errori come questo. Ciò fallirà per i file con caratteri speciali e potrebbe essere potenzialmente dannoso per il tuo sistema. Se vuoi la ricorsione e stai usando bash, usa 'globstar'. Se non usi bash, usa 'find ... -exec'. Ma non questo, * per favore *. – ghoti

0

uso

for i in `ls directory_path`; do sed -i 's/\r//' $i ; done 

per tutta la directory.

+0

è possibile eseguire questo prompt dei comandi di modulo? Ho bisogno di qualcosa che posso eseguire dal prompt dei comandi – user1934146

+0

sì, possiamo eseguirlo dal prompt dei comandi –

+0

prova questo al prompt per i in 'ls .'; do sed -i 's/\ r //' $ i; fatto –

2

Un'altra opzione: find your_dir type f -exec sed -i 's/\r//' {} \;

Perché non si utilizza il comando dos2unix? Se your'e facendo solo i sopra ci potrebbero essere i file sed (a seconda della loro origine) che avrà EOF non corretta (si può vedere se si esegue gatto e la richiesta in seguito è concatenato al file di output)

2
dos2unix *.txt 

funziona correttamente per convertire tutti i file * .txt in una directory ... non è necessario il comando 'trova'.

+0

Sì ma non è ricorsivo. –

24

Il modo più semplice per eseguire in modo ricorsivo dos2unix in un'intera directory consiste semplicemente nell'eseguire il comando find per ogni file trovato in base ai criteri.

Ad esempio, per trovare tutti i file (esclusi i nomi delle directory) nella directory corrente e tutte le sue sottodirectory e hanno dos2unix eseguire la conversione di default su ciascuno di questi file:

find . -type f -exec dos2unix -k -s -o {} ';' 

Questo stamperà ogni nome file singolo, ma non necessariamente cambia ciascuno di essi. Questo funziona come segue:

find .: Trova nulla in questa directory, incluse le sottodirectory, e nulla in quelle che si trovano pure (ricorsione)
-type f: restituire solo nomi "regolari dei file. Escludi i nomi delle cartelle dai risultati.
-exec: Esegui il seguente comando per ogni risultato. Tutto ciò che va oltre questo punto dovrebbe essere trattato come parte di quel comando finché non viene trovato il carattere ;.
dos2unix: dos2unix sarà eseguita con le seguenti opzioni ...
-k: Mantenere il timbro data del file di output lo stesso del file di input
-s: Salta i file binari (immagini, archivi, ecc.) Questa opzione è inclusa per impostazione predefinita, ma la utilizzo comunque nel caso in cui l'impostazione predefinita fosse diversa su alcuni sistemi (ad esempio OS X v. Debian v. CentOS v. Ubuntu v. ...).
-o: scrivere le modifiche direttamente nel file, anziché creare un nuovo file con i dati nel nuovo formato.
{}: questo indica a find di inserire il nome file trovato come parametro della chiamata dos2unix.
';': indicare find che i parametri per dos2unix sono terminati. Tutto ciò che va oltre questo punto sarà di nuovo trattato come un parametro di find.

+3

+1 per la spiegazione esaustiva di tutte le opzioni della riga di comando – ibizaman

+1

Una parola di cautela: sii MOLTO attento a garantire che non ci sia alcun .git posizionato da qualche parte nella directory, poiché potrebbe contenere oggetti con terminazioni di linea Windows (se hai eseguito il commit loro, per esempio). Può facilmente corrompere una directory git poiché gli sha dei file non corrisponderanno più. –

0
find $(pwd) -type f | xargs -I xxx sed -i 's/\r//g' xxx 
2

Semplice:

sed -i 's/\r//' filename1 filename2 … filenameN 

o, se si sta parlando sul contenuto di una directory

sed -i 's/\r//' * 

funzionare bene per me.

1

Solo l'aggiunta di un altro riferimento ...

Su Ubuntu 14.04 Nella pagina man dos2unix offre questo esempio, in particolare per la conversione recusive:

find . -name *.txt | xargs dos2unix

Citando dalla pagina man, questo sarà

... convertire tutti i file .txt nell'albero delle directory nella directory corrente ...