J'ai plusieurs centaines de Go de données que j'ai besoin de coller ensemble à l'aide de l'utilitaire de pâte UNIX en cygwin, mais cela ne fonctionnera pas correctement s'il y a des caractères Windows EOL dans les fichiers. Les données peuvent ou non avoir des caractères Windows EOL, et je ne veux pas dépenser le temps à exécuter Dos2unix si je ne l'ai pas obligé.
Donc, ma question est, dans Cygwin, comment puis-je déterminer si ces fichiers ont des caractères Windows EOL CRLF? p>
J'ai essayé de créer des données de test et d'exécuter p> mais qui semble correspondre à savoir si Dos2unix a été exécuté ou non. P > merci. p> p>
8 Réponses :
Le fichier (1) code> utilitaire connaît la différence:
$ file * | grep ASCII
2: ASCII text
3: ASCII English text
a: ASCII C program text
blah: ASCII Java program text
foo.js: ASCII C++ program text
openssh_5.5p1-4ubuntu5.dsc: ASCII text, with very long lines
windows: ASCII text, with CRLF line terminators
Et si le résultat indique "texte ASCII, avec de très longues lignes, sans terminateurs de ligne"
Heh, une très longue ligne sans des terminaisons de ligne peut être une entrée gênante à Coller (1) code>, mais peut-être
fichier (1) code> abandonne-t-il trop vite? Peut-être que les lignes sont plus longues que la zone qu'elle inspecte. (Un coup d'œil rapide à
Fichier code> S source (
src / file.h code>) semble inspecter 256 kilo-octets (
Howmany code>), donc ça sonne Comme votre entrée manquait des terminalisateurs de ligne pour une très longue ligne.)
Vous pouvez trouver en utilisant crlf est la valeur significative ici. p> p> fichier code>:
Si vous attendez que le code de sortie soit différent de Vous pouvez obtenir un code de sortie utilisable de SED code>, ce ne sera pas. Il effectuera une substitution ou non en fonction du match. Le code de sortie sera vrai sauf s'il y a une erreur.
grep code>, cependant. P>
#!/bin/bash for i in $(find . -type f); do if file $i | grep CRLF ; then echo $i file $i #dos2unix "$i" fi done Uncomment "#dos2unix "$i"" when you are ready to convert them.
Comme indiqué au-dessus de la solution "Fichier" fonctionne. Peut-être que l'extrait de code suivant peut aider.
Merci pour la pointe d'utiliser la commande Fichier (1), mais il a besoin d'un peu plus de raffinement. J'ai eu la situation où des fichiers texte simples non seulement, mais aussi des scripts ".sh" avaient le mauvais eol. Et «fichier» les signale comme suit, peu importe l'EOL:
bash$ find xxx -exec file -e soft {} \; | grep CRLF
grep récursif, avec filtre à motif de fichier nom de fichier de sortie, numéro de ligne et ligne elle-même p>
Vous pouvez utiliser l'option Dos2unix's -i pour obtenir des informations sur DOS UNIX MAC Line Breaks (dans cet ordre), BOMS et Text / Binary sans convertir le fichier.
find -name '*.txt' | xargs dos2unix -ic | xargs dos2unix