Tengo que convertir un directorio completo usando dos2unix. No puedo entender cómo hacer esto.
Tengo que convertir un directorio completo usando dos2unix. No puedo entender cómo hacer esto.
Respuestas:
find . -type f -print0 | xargs -0 dos2unix
Buscará recursivamente todos los archivos dentro del directorio actual y solicitará estos archivos comando dos2unix
\;; echo Hello
findinvocación no hace esta comprobación (aunque sería lo suficientemente simple como para agregar), pero los modernos dos2unixomiten correctamente los archivos binarios.
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.
nen un orden de magnitud o dos (dependiendo de cuántos archivos estamos hablando aquí)
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
dos2unix? Genuinamente curioso.
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.
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.
dos2unixalias que afecta la forma en que se expanden los argumentos. ¿Cuál es la salida de type dos2unixen su sistema?
**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.
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 **.
**implicaba, y el uso lo echodeja en claro.
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
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 {} {} \;
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
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.
Si no hay un subdirectorio, también puede tomar
ls | xargs -I {} dos2unix "{}"
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.)
find . -type f -print0 | xargs -0 dos2unixresolvería el problema, creo.