Question

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 simplement exécuter

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.

Était-ce utile?

La solution

Vous pouvez utiliser grep

egrep -l \r'\$ *

Autres conseils

Vous pouvez utiliser l'outil fichier , qui vous dira le type de fin de ligne. Vous pouvez également utiliser dos2unix -U , qui convertira tout le texte en fins de ligne Unix, quel que soit le début.

Quelque chose dans le sens 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 qu’il a plusieurs extrémités.

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 fichier pour rechercher le type de fichier. Ceux avec CRLF ont des caractères de retour de fenêtres. La sortie du fichier est délimitée par un : , et le premier champ est le chemin du fichier.

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, c'est très probablement Unix. Si vous voyez des paires 0x0D 0x0A, il est fort probable que MSDOS.

Windows utilise le caractère 13 & amp; 10 pour la fin de ligne, unix seulement l'un d'entre eux (je ne me souviens plus lequel). Vous pouvez donc remplacer le caractère 13 & amp; 10 pour le caractère 13 ou 10 (celui qui utilise unix).

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 des fins de ligne Windows en fins de ligne Unix avec l'utilitaire sed . Il vous suffit d'utiliser la commande suivante:

#!/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
gt; sed -i 's/\r//' my_file_with_win_line_endings.txt

Vous pouvez le mettre dans un script comme ceci:

<*>

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top