Comment convertir en masse tout le fichier dans une branche de système de fichiers entre le format de saut de ligne Unix et Windows?

14

Tout le monde sait :-) que dans les fichiers en texte brut Windows, les lignes se terminent par CR + LF, et sous Unix et Linux - avec LF uniquement. Comment puis-je convertir rapidement tous mes fichiers de code source d'un format à un autre et inversement?

Ivan
la source

Réponses:

17

Cela dépend: si les fichiers sont sous contrôle de version, cela pourrait être une décision peu polluante pour l'histoire. Git a la possibilité de convertir automatiquement les fins de ligne au moment du départ.

Si vous ne vous souciez pas et que vous souhaitez convertir rapidement, il existe des programmes comme fromdos/ todoset dos2unix/ unix2dosqui le font pour vous. Vous pouvez utiliser find: find . -type f -name '*.php' -exec dos2unix '{}' +.

janmoesen
la source
7

Il existe plusieurs programmes dédiés, dont

  • dos2unixet à unix2dospartir des outils dos2unix
  • todoset à fromdospartir des outils tofrodos

Choisissez simplement l'outil pour la direction appropriée et passez les noms des fichiers à convertir sur la ligne de commande.


Si vous n'en avez pas non plus, mais avez Linux ou Cygwin:

sed -i -e 's/\r\+$//' filename             # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename            # dos|unix -> dos

Si vous avez perl:

perl -i -pe 's/\r+$//' filename            # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename          # dos|unix -> dos

Avec seulement les outils POSIX (y compris BusyBox), pour passer d'Unix à DOS, vous devrez passer le caractère CR littéralement dans la commande sed.

cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename

Dans l'autre sens, vous pouvez simplement supprimer tous les CR:

tr -d '\r' <filename >filename.dos
mv filename.dos filename

Vous pouvez utiliser des caractères génériques pour convertir plusieurs fichiers dans le même répertoire à la fois, par exemple

sed -i -e 's/\r\+$//' *.txt

Pour convertir tous les fichiers du répertoire courant et de ses sous-répertoires, si votre shell est zsh, vous pouvez utiliser **/, par exemple

sed -i -e 's/\r\+$//' **/*.txt

Vous pouvez utiliser **/en bash ≥4, mais vous devez d' shopt -s globstarabord exécuter (vous pouvez mettre cette ligne dans votre ~/.bashrc). Vous pouvez utiliser **/dans ksh93, mais vous devez d' set -o globstarabord exécuter (vous pouvez mettre cette ligne dans votre ~/.kshrc.

Si vous ne pouvez utiliser que les outils qui nécessitent une redirection, utilisez une forboucle.

for x in *.txt; do
  tr -d '\r' <"$x" >"$x.dos"
  mv -- "$x.dos" "$x"
done

Si vous n'avez pas **/ou n'avez pas besoin d'une correspondance plus complexe pour sélectionner les fichiers à convertir, utilisez la findcommande. Voici un exemple Linux / Cygwin qui convertit récursivement tous les fichiers du répertoire courant et de ses sous-répertoires, à l'exception des fichiers appelés .oet des sous-répertoires appelés bin.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sed -i -e 's/\r\+$//' {} +

Voici un exemple POSIX. Nous disons findde démarrer un shell qui peut effectuer la redirection nécessaire.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       tr -d '\r' <"$0" >"$0.dos"
       mv -- "$0.dos" "$0"
' {} \;

Vous pouvez rendre la findméthode légèrement plus rapide, au détriment d'un code plus complexe, en utilisant une boucle dans la commande shell.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       for x; do
         tr -d '\r' <"$x" >"$x.dos"
         mv -- "$x.dos" "$x"
       done
' _ {} +
Gilles 'SO- arrête d'être méchant'
la source
2

Winscp sera également converti automatiquement, si cela est dit .

Si vos fichiers résident tous dans le même répertoire:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*
Nils
la source
Pouvez-vous s'il vous plaît décrire un peu plus, comment y parvenir via WinSCP?
harish sharma
@harishsharma J'ai ajouté un lien ci-dessus à "dit ainsi".
Nils