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 -uou quelque chose de similaire dans un script pour tout convertir, mais je veux pouvoir identifier les fichiers qui doivent d'abord être modifiés.
Vous pouvez utiliser grep
egrep -l $'\r'\$ *
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.
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.
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 }'
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.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.
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).
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.