Convertir tous les fichiers EOL (dos-> unix) de tous les fichiers d’un répertoire et de sous-répertoires de manière récursive sans dos2unix

Comment convertir tous les fichiers EOL (dos-> unix) de tous les fichiers d’un répertoire et de sous-répertoires de manière récursive sans dos2unix ? (Je ne l’ai pas et ne peux pas l’installer.)

Est-il possible de le faire en utilisant tr -d '\r' et pipes? Si c’est le cas, comment?

Pour tous les fichiers du répertoire en cours, vous pouvez le faire avec un one-liner perl -pi -e 's/\r\n/\n/g' * : perl -pi -e 's/\r\n/\n/g' * (volé ici )

EDIT : Et avec une petite modification, vous pouvez faire la récursion de sous-répertoire:

 find | xargs perl -pi -e 's/\r\n/\n/g' 

Vous pouvez utiliser l’option -i de sed pour changer les fichiers sur place:

 find . -type f -exec sed -i 's/\x0d//g' {} \+ 

Si j’étais vous, je garderais les fichiers pour que l’opération se passe bien. Ensuite, vous pouvez supprimer les fichiers temporaires lorsque vous avez terminé. Cela peut être fait comme ça:

 find . -type f -exec sed -i'.OLD' 's/\x0d//g' {} \+ find . -type f -name '*.OLD' -delete 

Avez-vous des noms de fichiers et des noms de répertoire sains, sans espaces, etc.?

Si oui, ce n’est pas trop difficile. Si vous avez affaire à des noms arbitraires contenant des lignes et des espaces, etc., vous devez travailler plus dur que cela.

 tmp=${TMPDIR:-/tmp}/crlf.$$ trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15 find . -type f -print | while read name do tr -d '\015' < $name > $tmp.1 mv $tmp.1 $name done rm -f $tmp.? trap 0 exit 0 

Le piège vous permet de ne pas laisser de fichiers temporaires. Il existe d’autres astuces que vous pouvez tirer, avec des noms plus aléatoires pour vos noms de fichiers temporaires. Normalement, vous n’en avez pas besoin à moins de travailler dans un environnement hostile.

Vous pouvez également utiliser l’éditeur en mode batch.

 find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \; 

Si \r n’est pas suivi par \n (peut-être le cas dans les fichiers de Tim Pote):

  • la suppression de \r (en utilisant tr -d ) peut supprimer les nouvelles lignes
  • le remplacement de \r par \n ne peut pas provoquer de nouvelles lignes doubles / sortingples

Peut-être que Tim Pote pourrait vérifier les points ci-dessus pour les fichiers qu’il a mentionnés.