web-dev-qa-db-fra.com

Commande Windows pour convertir les fins de ligne Unix?

Existe-t-il une commande Windows pour convertir les fins de ligne d'un fichier?

Nous avons un test.bat que nous devons exécuter pour démarrer notre serveur. Nous utilisons Perforce et nous avons besoin de fins de ligne Unix dans notre espace de travail. Pour une raison quelconque, nous ne sommes pas autorisés à modifier les fins de ligne en Windows dans nos espaces de travail. Cependant, le serveur fonctionne sous Windows.

Chaque fois que je dois exécuter le fichier bat, je l'ouvre dans Notepad ++ et choisissez Edition → Conversion EOL → Windows. Existe-t-il un moyen d'automatiser cette opération afin d'éviter de modifier manuellement les fins de ligne à chaque synchronisation avec Perforce?

Merci d'avance.

58
Deepti Jain

Cela peut être fait très facilement à l’aide de la commande more incluse dans Windows NT et versions ultérieures. Pour convertir input_filename qui contient UNIX EOL (End Of Line) \n en output_filename qui contient Windows EOL \r\n, procédez comme suit:

TYPE input_filename | MORE /P > output_filename

La commande more a des options de formatage supplémentaires que vous ignorez peut-être. Exécutez more/? pour savoir ce que more peut faire d'autre. 

54
TampaHaze

Utilisez unix2dos utility. Vous pouvez télécharger des fichiers binaires ici .

26
David Jashi

Vous pouvez le faire sans outils supplémentaires dans VBScript:

Do Until WScript.StdIn.AtEndOfStream
  WScript.StdOut.WriteLine WScript.StdIn.ReadLine
Loop

Placez les lignes ci-dessus dans un fichier unix2dos.vbs et exécutez-le comme ceci:

cscript //NoLogo unix2dos.vbs <C:\path\to\input.txt >C:\path\to\output.txt

ou comme ceci:

type C:\path\to\input.txt | cscript //NoLogo unix2dos.vbs >C:\path\to\output.txt

Vous pouvez également le faire dans PowerShell:

(Get-Content "C:\path\to\input.txt") -replace "`n", "`r`n" |
  Set-Content "C:\path\to\output.txt"

qui pourrait être encore simplifié à ceci:

(Get-Content "C:\path\to\input.txt") | Set-Content "C:\path\to\output.txt"

L’instruction ci-dessus fonctionne sans remplacement explicite, car Get-Content divise implicitement les fichiers d’entrée sous n’importe quel type de saut de ligne (CR, LF et CR-LF), et Set-Content joint le tableau d’entrée avec les sauts de ligne Windows (CR-LF) avant de l’écrire dans un fichier. fichier.

15
Ansgar Wiechers

Windows 'MORE n'est pas fiable, il détruit les tabulations de façon inévitable et ajoute des lignes.

unix2dos fait également partie de MinGW/MSYS, Cygutils, GnuWin32 et d’autres collections de ports binaires unix - et peut déjà être installé.

Lorsque python est présent, cette ligne transforme les fins de ligne en plate-forme actuelle - sur n’importe quelle plate-forme:

TYPE UNIXFILE.EXT | python -c "import sys; sys.stdout.write(sys.stdin.read())" > MYPLATFILE.EXT

ou

python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" UNIXFILE.EXT > MYPLATFILE.EXT

Ou mettez le one-liner dans un script .bat/Shell et sur le PATH en fonction de votre plate-forme:

@REM This is any2here.bat
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1

et utiliser cet outil comme

any2here UNIXFILE.EXT > MYPLATFILE.EXT
10
kxr

Je m'occupais de problèmes CRLF alors j'ai décidé de construire un outil de conversion vraiment simple (en NodeJS):

C'est NodeJS EOL converter CLI

Donc, si vous avez NodeJS avec npm installé, vous pouvez l’essayer:

npm i -g eol-converter-cli
eolConverter crlf "**/*.{txt,js,Java,etc}"

Le chemin peut être configuré dynamiquement en utilisant Glob regex (même regex que dans Shell).

Donc, si vous pouvez utiliser NodeJS, c'est très simple et vous pouvez intégrer cette commande pour convertir un espace de travail entier en fins de ligne souhaitées.

6
Jurosh

S'appuyant sur les réponses utiles de TampaHaze et MD XF. 

Cela modifiera tous les fichiers .txt in place dans le répertoire actuel de LF à CRLF dans l'invite de commande

for /f %f in ('dir /b "*.txt"') do ( type %f | more /p > %f.1 & move %f.1 %f )

Si vous ne voulez pas vérifier chaque changement 

bouge toi

À 

bouger/y

Pour inclure les sous-répertoires change

dir/b

À

dir/b/s

Pour faire tout cela dans un fichier de commandes comprenant des sous-répertoires sans demander l’utilisation ci-dessous

@echo off
setlocal enabledelayedexpansion

for /f %%f in ('dir /s /b "*.txt"') do (
    type %%f | more /p > %%f.1 
    move /y %%f.1 %%f > nul
    @echo Changing LF-^>CRLF in File %%f
)
echo.
pause
6
uosjead

essaye ça:

(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos

Protocole de session:

 C:\TEST> xxd -g1 file.unix 
 0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 6168962930810865 
 0000010: 0a 34 38 36 38 39 37 36 36 33 32 36 31 38 31 39 .486897463261819 
 0000020: 37 0a 37 32 30 30 31 33 33 39 31 39 32 38 35 7.72001373919285 
 0000030: 34 37 0a 35 30 32 32 38 35 35 32 33 33 30 30 32 30 47.5022815732020 
 0000040: 35 32 34 0a 524 .

 C:\TEST> (pour/f "delims ="% i in (fichier.unix) do @echo% i)> fichier. dos 

 C:\TEST> xxd -g1 fichier.dos 
 0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 6168962930810865 
 0000010: 0d 0a 34 38 36 38 39 37 34 36 33 32 36 31 38 31 ..48689746326181 
 0000020: 39 37 0d 0a 37 32 30 30 33 33 33 39 31 39 32 97..720013739192 
 0000030: 38 35 34 37 0d 35 30 32 32 38 31 35 37 33 32 8547..5022815732 
 0000040: 30 32 30 35 32 34 0d 0a 020524 ..
5
Endoro

Ma contribution pour cela, la conversion de plusieurs fichiers dans un dossier: for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp

3
Ricardo

Vous pouvez créer un script batch simple pour le faire pour vous:

TYPE %1 | MORE /P >%1.1
MOVE %1.1 %1

Ensuite, exécutez <batch script name> <FILE> et <FILE> sera instantanément converti en fins de ligne DOS.

1
MD XF

Basé sur la réponse d'Endoro, mais pour garder les blancs, essayez ceci:

@echo off
setlocal enabledelayedexpansion
(for /f "tokens=* delims=:" %%i in ('findstr /n "^" file.unix') do (
        set line=%%i
        set line=!line:*:=!
        echo(!line!
        ))>file.dos
1
Ir Relevant

J'ai cloné mon projet git en utilisant le git bash sur windows. Tous les fichiers avaient alors des fins LF. Notre référentiel a CRLF terminaisons par défaut.

J'ai supprimé le projet, puis je l'ai cloné à nouveau à l'aide du Windows Command Prompt. Les fins CRLF étaient intactes alors. Dans mon cas, si j'avais changé les terminaisons du projet, cela aurait entraîné un énorme engagement et aurait causé des problèmes à mes coéquipiers. Alors, est-ce que ça se passe comme ça? J'espère que ça aide quelqu'un. 

0
retr0

Je suis un cours AWS et dois souvent copier des zones de texte dans les formulaires Web AWS vers le Bloc-notes Windows. Donc, je reçois le texte délimité par LF uniquement dans mon presse-papiers. J'ai accidentellement découvert que le coller dans mon éditeur Delphi, puis appuyer sur Ctrl + K + W écrirait le texte dans un fichier avec des délimiteurs CR + LF. (Je parie que beaucoup d'autres IDE éditeurs feraient de même).

0
RHenningsgard