Existe-t-il un moyen d'identifier rapidement les fichiers avec une terminaison de ligne Windows ou Unix?

8

Je sais que nous pouvons utiliser dos2unix pour convertir entre la terminaison de ligne Windows et Unix. Je me demande s'il existe une commande qui peut me dire si un fichier a une terminaison de ligne Windows ou Unix?

Oliver
la source

Réponses:

11
$ file f1 f2 f3
f1: ASCII text, with CRLF, LF line terminators
f2: ASCII text, with CRLF line terminators
f3: ASCII text

Si vous jugez nécessaire de vérifier chaque ligne du fichier, vous pouvez le faire:

$ grep -c "^M" f1 f2
f1:0
f2:3

$ wc -l f1 f2
 3 f1
 3 f2
 6 total

Le "^ M" a été entré en utilisant Ctrl + V Ctrl + M et est le caractère ASCII de retour chariot (CR).

Ici, nous voyons que le fichier f1 a trois lignes mais pas de CR donc toutes les fins de ligne doivent être des LF solo de style Unix.

Le fichier f2 a un nombre égal de lignes et de CR, il est donc raisonnable de deviner qu'il utilise les fins de ligne CR, LF telles qu'utilisées par MSDOS et Windows.

RedGrittyBrick
la source
1
filene sort pas l'état de fin de ligne s'il peut trouver une correspondance plus proche que ASCII, c'est-à-dire setup.py: a python script text executable. Un ne semble pas trouver un indicateur pour changer ce comportement.
miracle2k
1
@ miracle2k: Peut-être qu'un fichier magique personnalisé pourrait être créé pour ce faire. file -m magicfile f1 f2 f3
RedGrittyBrick
1

Sous Windows, un moyen rapide de le savoir est d'ouvrir votre fichier dans le Bloc-notes. Le bloc-notes affichera les sauts de ligne uniquement sur les terminaisons de style Windows (CR + LF), et non les terminaisons Unix (LF). Ainsi, votre texte Unix ressemblera à ceci:

Line1Line2Line3Line4

alors que le texte de Windows ressemblera à ceci:

line1
line2
line3
line4

Je ne connais pas très bien la plate-forme unix / linux, mais je suis sûr que vous pouvez utiliser des hacks similaires avec des programmes comme gedit ou emacs.

Prahlad Yeri
la source
0
c=($(perl -0777ne 'print $_ =~ tr/\n//; print " "; 
                   print $_ =~ tr/\r//;'))
if   ((!(c[0] +   c[1]))) ;then echo no line endings  
elif ((  c[0] && !c[1] )) ;then echo LF
elif (( !c[0] &&  c[1] )) ;then echo CR 
elif ((  c[0] ==  c[1] )) ;then echo CRLF 
else echo "anbigious LF ${c[0]} CR ${c[1]}"
fi

Notez que, pour des raisons de vitesse, seuls les \rs et \ns individuels sont comptés, mais ce serait un fichier assez délirant qui avait un nombre égal des deux types et pourtant n'était pas un fichier CRLF Windows ...

Notez également que l'outil * nix filene fait pas une analyse complète du fichier, contrairement à ce perlscript. Vous n'avez pas indiqué sur quelle plateforme vous souhaitez qu'elle s'exécute; J'ai utilisé un bashscript pour tester la sortie de perl, mais cela peut être changé en cmdscript Window .

Vous pouvez simplement y diriger votre fichier.

Peter.O
la source