Devo convertire un'intera directory usando dos2unix. Non sono in grado di capire come farlo.
Devo convertire un'intera directory usando dos2unix. Non sono in grado di capire come farlo.
Risposte:
find . -type f -print0 | xargs -0 dos2unix
Troverà ricorsivamente tutti i file nella directory corrente e richiederà questi comandi dos2unix
\;; echo Hello
findinvocazione non fa questo controllo (anche se sarebbe abbastanza semplice da aggiungere), ma moderno dos2unixsalta correttamente i file binari.
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.
ndi un ordine di grandezza o due (a seconda di quanti file stiamo parlando qui)
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
dos2unix? Davvero curioso.
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.
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.
dos2unixalias che sta influenzando il modo in cui gli argomenti vengono espansi. Qual è l'output di type dos2unixsul tuo sistema?
**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.
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 **.
**implicava, e l'utilizzo echolo chiarisce.
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
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 {} {} \;
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
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.
Se non esiste una sottodirectory, puoi anche prendere
ls | xargs -I {} dos2unix "{}"
dos2unix *è più semplice e sarà effettivamente più robusto di così. (In genere non è consigliabile convogliare l'output di ls, perché è uno strumento di formattazione ed *è più affidabile per l'uso programmatico.)
find . -type f -print0 | xargs -0 dos2unixrisolverebbe il problema penso.