¿Cómo puedo ejecutar dos2unix en un directorio completo? [cerrado]

Respuestas:

591

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

Buscará recursivamente todos los archivos dentro del directorio actual y solicitará estos archivos comando dos2unix

CyberDem0n
fuente
94
Se rompería si tuviera espacios en el nombre del archivo. find . -type f -print0 | xargs -0 dos2unixresolvería el problema, creo.
Noufal Ibrahim
1
Di como este hallazgo. -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src y dio el error find: falta el argumento a `-exec '
Vivek Gaur
1
Tenga en cuenta que la barra invertida que escapa al punto y coma asegura que los comandos dos2unix estén separados por punto y coma para que no terminen combinados. Si desea ejecutar otro comando después, necesitará otro punto y coma, así que\;; echo Hello
Josh
1
Sin embargo, tenga cuidado con este comando, no comprueba si el archivo necesita la conversión, por lo que incluso los archivos binarios se "convertirán", corrompiéndolos.
vguzmanp
2
@vguzmanp Verdadero, la findinvocación no hace esta comprobación (aunque sería lo suficientemente simple como para agregar), pero los modernos dos2unixomiten correctamente los archivos binarios.
Kyle Strand
68

Si es un directorio grande, puede considerar ejecutarlo con múltiples procesadores:

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

Esto pasará 1 archivo a la vez y usará 4 procesadores.

nikc
fuente
1
Este método tiene la ventaja de que continúa, ¡aunque dos2unix encuentra algún problema! Algo así como un método "--force". ¡Gracias por eso!
freeo
Wow: me ahorró mucho tiempo para resolver problemas al intentar convertir un código de desarrollador de Windows que tenía cama agregada incorrectamente. ¡¡Gracias!!
El NetYeti
1
Iniciar un nuevo proceso de dos2unix para cada archivo individual introducirá una sobrecarga innecesaria. Lo subiría nen un orden de magnitud o dos (dependiendo de cuántos archivos estamos hablando aquí)
JonoCoetzee
25

Como estaba poco satisfecho con dos2unix, implementé mi propia utilidad simple. Además de algunas ventajas en velocidad y previsibilidad, la sintaxis también es un poco más simple:

endlines unix *

Y si desea que se convierta en subdirectorios (omitiendo directorios ocultos y archivos que no son de texto):

endlines unix -r .

endlinesestá disponible aquí https://github.com/mdolidon/endlines

Mathias Dolidon
fuente
1
¡Esto es perfecto! La línea más cercana que pude llegar a esto está aquí: unix.stackexchange.com/a/365679/112190
phyatt
2
¿Cómo mejora dos2unix? Genuinamente curioso.
Walf
3
1 / Principalmente, hay toneladas de diferentes dos2unix, con diferentes capacidades (algunos leen UTF32 por ejemplo, mientras que otros no; las líneas finales no lo hacen). Solo hay uno endlines, cuyas capacidades son bien conocidas. 2 / liberal en la entrada, no todos lo dos2unixson. 3 / exploración eficiente del árbol de archivos, diseñada para ser rápida y práctica en decenas de miles de archivos. 4 / se ejecuta fuera de la caja en OSX, lo que es menos importante ahora que existe el paquete Brew.
Mathias Dolidon
1
En mi caso es exactamente lo que necesitaba muchas gracias. Las características que son bienvenidas son la manera fácil de procesar un árbol de directorios y el rápido tiempo de ejecución.
AlSavi
17

Probablemente sea mejor omitir archivos y carpetas ocultos, como .git.So, en lugar de usar find, si su bashversión es lo suficientemente reciente o si está usando zsh, simplemente haga lo siguiente:

dos2unix **

Tenga en cuenta que para Bash, esto requerirá:

shopt -s globstar

.... pero esta es una característica lo suficientemente útil que honestamente deberías ponerla de .bashrctodas formas.

Si no desea omitir carpetas y archivos ocultos, pero aún así no quiere meterse con find(y no lo culparía), puede proporcionar un segundo argumento de globo recursivo para que coincida solo con las entradas ocultas:

dos2unix ** **/.*

Tenga en cuenta que en ambos casos, el globo se expandirá para incluir directorios, por lo que verá la siguiente advertencia (potencialmente muchas veces): Skipping <dir>, not a regular file.

Kyle Strand
fuente
1
Esto no funcionó para mí. ¿La sintaxis de globstar funciona para dos2unix? He usado globstar en otros lugares con éxito, pero no pude hacer que esto funcione. Estoy usando Bash 4.3.11 (1)
NS du Toit
@NSduToit * Los shells de estilo NIX no permiten que los ejecutables alteren el comportamiento de la expansión de argumentos, porque (a diferencia de Windows) la expansión de argumentos se realiza antes de que el ejecutable reciba los argumentos. Entonces, lo único en lo que puedo pensar es que tienes algún tipo de dos2unixalias que afecta la forma en que se expanden los argumentos. ¿Cuál es la salida de type dos2unixen su sistema?
Kyle Strand
1
@NSduToit Hay algo de confusión aquí. Mi respuesta dice explícitamente que el punto de usar en **lugar de find"omitir archivos y carpetas ocultos, como .git". dos2unixnunca ve los archivos ocultos, porque **no se expande para mostrarlos. Si desea que se ejecute automáticamente dos2unixen los archivos y carpetas ocultos, puede utilizar findo dos2unix ** **/.*la **/.*ampliará sólo los archivos y carpetas ocultos, incluyendo .(el directorio raíz), ..(dir la matriz), y cualquier otra entrada ocultos en la carpeta actual.
Kyle Strand
1
(Tenga en cuenta que dos2unixsimplemente se imprime Skipping <dir>, not a regular file.cuando se ejecuta en un directorio, por lo que se ejecuta ..y .es seguro). Además, combinar lscon un globo no es una buena manera de verificar cómo se expande el globo; use echoen su lugar: echo **imprimirá los argumentos que dos2unixrecibe de dos2unix **.
Kyle Strand
1
¡Gracias! ¡Tiene sentido! De acuerdo, tenía una idea totalmente equivocada sobre lo que **implicaba, y el uso lo echodeja en claro.
NS du Toit
7

Un caso de uso común parece ser estandarizar las terminaciones de línea para todos los archivos comprometidos con un repositorio de Git :

git ls-files | xargs dos2unix

Tenga en cuenta que ciertos archivos (p *.sln. Ej. , *.batEtc.) solo se usan en sistemas operativos Windows y deben mantener el CRLFfinal:

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

Si es necesario, use .gitattributes

Friederbluemle
fuente
6

Para cualquier usuario de Solaris (estoy usando 5.10, puede aplicarse también a versiones más recientes, así como a otros sistemas unix):

dos2unix no sobrescribe por defecto el archivo, solo imprimirá la versión actualizada en stdout, por lo que tendrá que especificar el origen y el destino, es decir, el mismo nombre dos veces:

find . -type f -exec dos2unix {} {} \;
Brett
fuente
2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done
rafapedroche
fuente
1
Bienvenido a Stack Overflow. Aunque su solución es una solución válida, sería genial si pudiera agregarle alguna explicación. También puede considerar hacer referencia a otras respuestas para justificar su respuesta. Eche un vistazo a Cómo responder para obtener más información.
kvantour
2

He tenido el mismo problema y gracias a las publicaciones aquí lo he resuelto. Sabía que tenía alrededor de un centenar de archivos y necesitaba ejecutarlo solo para archivos * .js. find . -type f -name '*.js' -print0 | xargs -0 dos2unix

Gracias por toda tu ayuda.

Strabek
fuente
0

Creo que la forma más simple es:

dos2unix $(find . -type f)
Sahand
fuente
0

Lo busqué en Google un millón de veces, así que mi solución es simplemente poner esta función bash en su entorno.

.bashrco .profileo lo que sea

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

Uso

$ dos2unixd ./somepath

De esta manera, todavía tiene el comando original dos2unixy es fácil recordar este dos2unixd.

Ben Winding
fuente
-1

Si no hay un subdirectorio, también puede tomar

ls | xargs -I {} dos2unix "{}"
Summer_More_More_Tea
fuente
44
Si no hay subdirectorios, dos2unix *es más simple y en realidad será más robusto que esto. (Que generalmente no es recomendable para canalizar la salida de ls, porque es una herramienta de formato y *es más fiable para el uso programático.)
Kyle Strand