web-dev-qa-db-fra.com

Comment déterminer la fin de ligne d'un fichier

J'ai un tas (des centaines) de fichiers qui sont supposés avoir des fins de ligne Unix. Je soupçonne fortement que certains d’entre eux ont une fin de ligne Windows, et je veux déterminer par programme ceux qui en ont.

Je sais que je peux juste courir 

flip -u
ou quelque chose de similaire dans un script pour tout convertir, mais je veux pouvoir identifier les fichiers qui doivent d'abord être modifiés.

50
nwahmaet

Vous pouvez utiliser grep

egrep -l $'\r'\$ *
28
stimms

Vous pouvez utiliser l'outil file , qui vous indiquera le type de fin de ligne. Ou bien, vous pouvez simplement utiliser dos2unix -U qui convertira tout en fin de ligne Unix, quel que soit le début.

67
Adam Rosenfield

Quelque chose dans le genre de:

Perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME

bien que certaines de ces expressions rationnelles aient besoin d'être peaufinées et rangées.

Cela produira votre fichier avec WIN, MAC ou UNIX à la fin de chaque ligne. Bon si votre fichier est en quelque sorte un gâchis épouvantable (ou un diff) et a des fins mixtes.

14
joachim

Voici la réponse la plus sûre. Stimms answer ne prend pas en compte les sous-répertoires et les fichiers binaires

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • Utilisez file pour trouver le type de fichier. Ceux avec CRLF ont des caractères de retour de fenêtres. La sortie de file est délimitée par un : et le premier champ est le chemin du fichier.
4
Bryce Guinta

Unix utilise un octet, 0x0A (LineFeed), tandis que Windows utilise deux octets, 0x0D 0x0A (retour chariot, saut de ligne).

Si vous ne voyez jamais un 0x0D, alors c'est très probablement Unix. Si vous voyez 0x0D 0x0A paires, alors il est très probable que MSDOS.

3
Adam Davis

Windows utilise les caractères 13 et 10 pour les fins de ligne, unix seulement (je ne me rappelle plus lequel). Vous pouvez donc remplacer les caractères 13 et 10 par les caractères 13 ou 10 (celui qui utilise unix).

0
TcKs

Lorsque vous savez quels fichiers ont des fins de ligne Windows (0x0D 0x0A ou \r \n), que ferez-vous avec ces fichiers? Je suppose que vous allez les convertir en fins de lignes Unix (0x0A ou \n). Vous pouvez convertir un fichier avec une fin de ligne Windows en fin de ligne Unix avec l'utilitaire sed, utilisez simplement la commande suivante:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt

Vous pouvez le mettre dans un script comme ceci:

#!/bin/bash

function travers()
{
    for file in $(ls); do
        if [ -f "${file}" ]; then
            sed -i 's/\r//' "${file}"
        Elif [ -d "${file}" ]; then
            cd "${file}"
            travers
            cd ..
        fi
    done
}

travers

Si vous l'exécutez à partir de votre répertoire racine avec des fichiers, vous serez sûr que tous les fichiers sont terminés par Unix.

0
1ac0