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
find
invocazione non fa questo controllo (anche se sarebbe abbastanza semplice da aggiungere), ma moderno dos2unix
salta 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.
n
di 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 dos2unix
sono. 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 bash
versione è 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 .bashrc
caso.
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.
dos2unix
alias che sta influenzando il modo in cui gli argomenti vengono espansi. Qual è l'output di type dos2unix
sul tuo sistema?
**
posto di find
è "saltare file e cartelle nascosti, come .git
". dos2unix
non vede mai i file nascosti, perché **
non si espande per mostrarli. Se si desidera eseguire automaticamente dos2unix
il file e cartelle nascosti, è possibile utilizzare find
o 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.
dos2unix
stampa semplicemente Skipping <dir>, not a regular file.
quando eseguito su una directory, quindi in esecuzione ..
ed .
è sicuro.) Inoltre, la combinazione ls
con un glob non è un buon modo per verificare come il glob è espanso; usa echo
invece: echo **
stamperà gli argomenti che dos2unix
riceve da dos2unix **
.
**
implicava, e l'utilizzo echo
lo 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
, *.bat
ecc.) Vengono utilizzati solo su sistemi operativi Windows e devono mantenere il CRLF
finale:
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.
.bashrc
o .profile
qualunque cosa
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
uso
$ dos2unixd ./somepath
In questo modo hai ancora il comando originale dos2unix
ed è 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 dos2unix
risolverebbe il problema penso.