12
votes

Convertir tout EOL (DOS-> UNIX) de tous les fichiers d'un répertoire et de sous-répertoires récursives sans Dos2unix

Comment convertir tous les fichiers EOL (DOS-> UNIX) de tous les fichiers d'un répertoire et de sous-répertoires sans dos2unix ? (Je ne l'ai pas et je ne peux pas l'installer.)

Y a-t-il un moyen de le faire en utilisant tr -d '\ r' et des tuyaux? Si oui, comment?


0 commentaires

6 Réponses :


10
votes

Vous pouvez utiliser le drapeau -i de SED pour modifier les fichiers in-place: xxx

Si j'étais vous, je tiens aux fichiers pour vous assurer que L'opération s'est bien passée. Ensuite, vous pouvez supprimer les fichiers temporaires lorsque vous obtenez terminé. Cela peut être fait comme si: xxx


2 commentaires

Cela devrait gérer des noms de fichiers contenant des espaces. Ne pas ajouter de nouvelle ligne à la fin de chaque ligne car les fichiers deviennent à double espacement - ou même triple espacés (puisque vous remplacez les retours de chariot avec de nouvelles lignes)? Oui, je viens de le tester.


@ Denniswilliamson Je viens de tirer cela d'un script que j'ai au bureau sans même penser à deux fois. Maintenant, je me demande comment ces scripts fonctionnent du tout. (Cela pourrait avoir à voir avec le fait qu'ils étaient censés convertir des fichiers créés dans Microsoft Office for Mac.) La nouvelle version doit fonctionner correctement.



2
votes

Avez-vous des noms de fichier sain et des noms de répertoires sans espaces, etc. en eux?

Si oui, ce n'est pas trop difficile. Si vous devez faire face à des noms arbitraires contenant de nouvelles lignes et des espaces, etc., vous devez alors travailler plus fort que cela. P>

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


1 commentaires

Notez que tr reconnaît effectivement \ r (variantes BSD et GNU), vous pouvez donc utiliser tr -d '\ r' .



13
votes

Pour tous les fichiers du répertoire en cours, vous pouvez le faire avec un Perl One-Liner: perl -pi -e 'S / \ r \ n / \ n / g' * (volé de < Un href = "http://manavg.blogspot.com/2009/04/perl-one-liner-for-dos2unix.html" rel = "noreferrer"> ici )

edit < / Strong>: et avec une petite modification, vous pouvez faire de la récursion sous-répertoire: xxx


2 commentaires

Si votre recherche et xargs prend en charge: trouver -print0 | Xargs -0 ... gérera des noms de fichiers avec des espaces.


Regardez si vous utilisez cette commande sur Git Repository. Exclure .git sous-répertoire de trouver.



2
votes

Vous pouvez également utiliser l'éditeur en mode batch. XXX


1 commentaires

Cette solution était la seule qui a fonctionné pour moi sur Mac OS X. Les autres ont été raccrochés sur divers problèmes tels que ne peuvent pas faire dans la modification suivante :./lang n'est pas un fichier régulier, <> ligne 22167.



0
votes

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

  • Suppression \ r (en utilisant tr -d ) peut supprimer les nouvelles lignes
  • Remplacement de \ r avec \ n peut ne pas causer de double / triple nouvelles lignes

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


1 commentaires

Cela me considère comme un bon commentaire sur la réponse de Tim Pote, mais il n'est pas très clair sur la façon dont cela répond à la question.



0
votes

Ceci supprime les retours de chariot de tous les fichiers du répertoire actuel et de tous les sous-répertoires, et devrait fonctionner sur la plupart des OSS de type UNIX:

grep -lIUre '\r' | xargs sed -i 's/\r//'


0 commentaires