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
find
invocación no hace esta comprobación (aunque sería lo suficientemente simple como para agregar), pero los modernos dos2unix
omiten 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.
n
en 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 .
endlines
está 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 dos2unix
son. 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 bash
versió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 .bashrc
todas 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.
dos2unix
alias que afecta la forma en que se expanden los argumentos. ¿Cuál es la salida de type dos2unix
en su sistema?
**
lugar de find
"omitir archivos y carpetas ocultos, como .git
". dos2unix
nunca ve los archivos ocultos, porque **
no se expande para mostrarlos. Si desea que se ejecute automáticamente dos2unix
en los archivos y carpetas ocultos, puede utilizar find
o 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.
dos2unix
simplemente 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 ls
con un globo no es una buena manera de verificar cómo se expande el globo; use echo
en su lugar: echo **
imprimirá los argumentos que dos2unix
recibe de dos2unix **
.
**
implicaba, y el uso lo echo
deja 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. , *.bat
Etc.) solo se usan en sistemas operativos Windows y deben mantener el CRLF
final:
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.
.bashrc
o .profile
o lo que sea
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
Uso
$ dos2unixd ./somepath
De esta manera, todavía tiene el comando original dos2unix
y 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 dos2unix
resolvería el problema, creo.