Come posso eseguire dos2unix su un'intera directory? [chiuso]


Risposte:


591

find . -type f -print0 | xargs -0 dos2unix

Troverà ricorsivamente tutti i file nella directory corrente e richiederà questi comandi dos2unix


94
Si romperebbe se avessi spazi nel nome file. find . -type f -print0 | xargs -0 dos2unixrisolverebbe il problema penso.
Noufal Ibrahim,

1
ho dato così questa scoperta. -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src e ha restituito l'errore: argomento mancante a `-exec '
Vivek Gaur

1
Nota la barra rovesciata che sfugge al punto e virgola assicura che i comandi dos2unix siano separati da punti e virgola in modo che non finiscano insieme. Se vuoi eseguire un altro comando in seguito, avrai bisogno di un altro punto e virgola, quindi\;; echo Hello
Josh,

1
Fai attenzione con questo comando, non controlla se il file ha bisogno della conversione, quindi anche i file binari verranno "convertiti", corrompendoli.
vguzmanp,

2
@vguzmanp Vero, l' findinvocazione non fa questo controllo (anche se sarebbe abbastanza semplice da aggiungere), ma moderno dos2unixsalta correttamente i file binari.
Kyle Strand,

68

Se si tratta di una directory di grandi dimensioni, potresti prendere in considerazione l'esecuzione con più processori:

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix 

Questo passerà 1 file alla volta e utilizzerà 4 processori.


1
Questo metodo ha il vantaggio che continua, anche se dos2unix incontra dei problemi! Qualcosa come un metodo "--force". Grazie per questo!
gratis il

Caspita - mi ha fatto risparmiare un sacco di tempo per risolvere i problemi mentre tentavo di convertire le aggiunte di codice degli sviluppatori Windows che avevano aggiunto il letto a git in modo errato. Grazie!!
Il NetYeti il

1
L'avvio di un nuovo processo dos2unix per ogni singolo file comporta un sovraccarico enormemente non necessario. Lo aumenterei ndi un ordine di grandezza o due (a seconda di quanti file stiamo parlando qui)
JonoCoetzee,

25

Come mi è capitato di essere scarsamente soddisfatto da dos2unix, ho implementato la mia semplice utility. A parte alcuni vantaggi in termini di velocità e prevedibilità, la sintassi è anche un po 'più semplice:

endlines unix *

E se vuoi che scenda in sottodirectory (saltando dirs nascosti e file non di testo):

endlines unix -r .

endlinesè disponibile qui https://github.com/mdolidon/endlines


1
Questo è perfetto! Il one-liner più vicino che ho potuto raggiungere è qui: unix.stackexchange.com/a/365679/112190
phyatt

2
Come migliora dos2unix? Davvero curioso.
Walf,

3
1 / Principalmente, ci sono tonnellate di diversi dos2unix, con capacità diverse (alcuni leggono UTF32 per esempio, mentre altri no; le linee di fondo no). Ce n'è solo uno endlines, le cui capacità sono ben note. 2 / liberale sull'input, non tutti lo dos2unixsono. 3 / efficiente esplorazione dell'albero dei file, progettata per essere veloce e pratica su decine di migliaia di file. 4 / si esaurisce immediatamente su OSX - che è meno importante ora che esiste il pacchetto Brew.
Mathias Dolidon,

1
Nel mio caso è esattamente ciò di cui avevo bisogno grazie mille. Le funzionalità che sono gradite sono il modo semplice per elaborare un albero di directory e i tempi di esecuzione rapidi.
AlSavi il

17

Probabilmente è meglio saltare file e cartelle nascosti, come .git.So invece di usare find, se la tua bashversione è abbastanza recente o se stai usando zsh, fai semplicemente:

dos2unix **

Nota che per Bash ciò richiederà:

shopt -s globstar

.... ma questa è una funzione abbastanza utile che dovresti onestamente inserirla nel tuo .bashrccaso.

Se non vuoi saltare file e cartelle nascosti, ma non vuoi ancora pasticciare find(e non ti darei la colpa), puoi fornire un secondo argomento ricorsivo-glob per abbinare solo le voci nascoste:

dos2unix ** **/.*

Si noti che in entrambi i casi, il globo si espanderà per includere le directory, quindi verrà visualizzato il seguente avviso (potenzialmente più volte): Skipping <dir>, not a regular file.


1
Questo non ha funzionato per me. La sintassi globstar funziona per dos2unix? Ho usato globstar altrove con successo, ma non sono riuscito a farlo funzionare. Sto usando Bash 4.3.11 (1)
NS du Toit il

@NSduToit * Le shell in stile NIX non consentono agli eseguibili di modificare il comportamento dell'espansione degli argomenti, poiché (diversamente da Windows) l'espansione degli argomenti viene eseguita prima che l'eseguibile riceva mai gli argomenti. Quindi l'unica cosa a cui riesco a pensare è che hai una sorta di dos2unixalias che sta influenzando il modo in cui gli argomenti vengono espansi. Qual è l'output di type dos2unixsul tuo sistema?
Kyle Strand,

1
@NSduToit Qui c'è un po 'di confusione. La mia risposta afferma esplicitamente che il punto di usare al **posto di findè "saltare file e cartelle nascosti, come .git". dos2unixnon vede mai i file nascosti, perché **non si espande per mostrarli. Se si desidera eseguire automaticamente dos2unixil file e cartelle nascosti, è possibile utilizzare findo dos2unix ** **/.*la **/.*si espanderà solo le cartelle e file nascosti, tra cui .(la directory di root), ..(il dir madre), e tutte le altre voci nascoste nella cartella corrente.
Kyle Strand,

1
(Si noti che dos2unixstampa semplicemente Skipping <dir>, not a regular file.quando eseguito su una directory, quindi in esecuzione ..ed .è sicuro.) Inoltre, la combinazione lscon un glob non è un buon modo per verificare come il glob è espanso; usa echoinvece: echo **stamperà gli argomenti che dos2unixriceve da dos2unix **.
Kyle Strand,

1
Grazie! Ha senso! Ok, ho avuto un'idea totalmente sbagliata su ciò che **implicava, e l'utilizzo echolo chiarisce.
NS du Toit,

7

Un caso d'uso comune sembra essere quello di standardizzare le terminazioni di riga per tutti i file impegnati in un repository Git :

git ls-files | xargs dos2unix

Tieni presente che alcuni file (ad esempio *.sln, *.batecc.) Vengono utilizzati solo su sistemi operativi Windows e devono mantenere il CRLFfinale:

git ls-files '*.sln' '*.bat' | xargs unix2dos

Se necessario, utilizzare .gitattributes


6

Per tutti gli utenti di Solaris (sto usando 5.10, può applicarsi anche alle versioni più recenti, così come ad altri sistemi unix):

dos2unix non si limita a sovrascrivere il file, stamperà semplicemente la versione aggiornata su stdout, quindi dovrai specificare l'origine e la destinazione, cioè lo stesso nome due volte:

find . -type f -exec dos2unix {} {} \;

2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done

1
Benvenuto in Stack Overflow. Sebbene la tua soluzione sia valida, sarebbe bello se tu potessi aggiungere qualche spiegazione ad essa. Puoi anche considerare di fare riferimento ad altre risposte per giustificare la tua risposta. Dai un'occhiata a Come rispondere per maggiori informazioni.
kvantour

2

Ho avuto lo stesso problema e grazie ai post qui ho risolto. Sapevo di avere un centinaio di file e dovevo eseguirlo solo per i file * .js. find . -type f -name '*.js' -print0 | xargs -0 dos2unix

Grazie a tutti per il vostro aiuto.


0

Penso che il modo più semplice sia:

dos2unix $(find . -type f)

0

Ho cercato su Google come un milione di volte, quindi la mia soluzione è quella di mettere questa funzione bash nel tuo ambiente.

.bashrco .profilequalunque cosa

dos2unixd() {
  find $1 -type f -print0 | xargs -0 dos2unix
}

uso

$ dos2unixd ./somepath

In questo modo hai ancora il comando originale dos2unixed è facile ricordare questo dos2unixd.


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.