Question

Quelqu'un sait-il d'une façon (disons Powershell, ou un outil) dans Windows qui peut récursif sur un répertoire et convertir tous les fichiers unix aux fichiers Windows.

Je serais parfaitement heureux avec une manière Powershell pour détecter au moins un fichier unix.

Il est facile de le faire pour un seul fichier, mais je suis après quelque chose un peu plus évolutive (se penchant donc vers une solution Powershellish).

Était-ce utile?

La solution

Voici la façon pure PowerShell si vous êtes intéressé.

Recherche de fichiers avec atleast une ligne UNIX fin (PowerShell v1):

dir * -inc *.txt | %{ if (gc $_.FullName -delim "`0" | Select-String "[^`r]`n") {$_} }

Voici comment vous trouvez et les fins de ligne UNIX secrètes à des fins de ligne Windows. Une chose importante à noter est qu'une ligne supplémentaire de fin (\ r \ n) sera ajoutée à la fin du fichier s'il n'y a pas déjà une ligne qui se termine à la fin. Si vous ne voulez vraiment pas que, je posterai un exemple de la façon dont vous pouvez l'éviter (il est un peu plus complexe).

Get-ChildItem * -Include *.txt | ForEach-Object {
    ## If contains UNIX line endings, replace with Windows line endings
    if (Get-Content $_.FullName -Delimiter "`0" | Select-String "[^`r]`n")
    {
        $content = Get-Content $_.FullName
        $content | Set-Content $_.FullName
    }
}

Les travaux ci-dessus, car PowerShell coupera automatiquement le contenu sur \ n (baisse \ r si elles existent), puis ajoutez \ r \ n quand il écrit chaque chose (dans ce cas, une ligne) au fichier. Voilà pourquoi vous finissez toujours avec une ligne se terminant à la fin du fichier.

En outre, j'ai écrit le code ci-dessus pour qu'il modifie uniquement les fichiers dont il a besoin pour. Si vous ne se soucient pas que vous pouvez supprimer l'instruction if. Oh, assurez-vous que seuls les fichiers se rendre à l'ForEach-Object. Autre que vous pouvez faire tout ce que vous voulez filtrer au début de ce pipeline.

Autres conseils

Il y a dos2unix et unix2dos Cygwin .

Cela semble fonctionner pour moi.

Get-Content Unix.txt | Out-File Dos.txt

vim , ouvrez votre dossier et numéro

:se fileformat=dos|up

Lot pour plusieurs fichiers (tous les fichiers * .txt dans C: \ tmp - récursives):

:args C:\tmp\**\*.txt
:argdo se fileformat=dos|up

Vous pouvez utiliser Visual Studio. Fichier -> Enregistrer les options avancées ...

Si Cygwin ne vous appartient pas, il existe de nombreux exécutables autonomes pour unix2dos sous Windows si vous Google autour, ou vous pouvez écrire vous-même, voir ma question similaire (sens inverse pour la conversion) here .

J'ai passé 6 heures à tester hier et aujourd'hui le code ci-dessus dans une boucle avec 10.000 fichiers, beaucoup d'entre eux> 50kb taille. En bout de ligne, le code est très inefficace Powershell / lent / inutilisable pour les gros fichiers et grand nombre de fichiers. Il ne conserve pas les octets de nomenclature. J'ai trouvé unix2dos 7.2.3 être la solution la plus rapide et la plus pratique. Espérons que cela aide les autres et les fait gagner du temps.

Ouverture d'un fichier avec les fins de ligne Unix dans Wordpad et enregistrer réécrira toutes les fins de ligne comme DOS. Un peu laborieux pour un grand nombre de fichiers, mais cela fonctionne assez bien pour quelques fichiers chaque fois dans un certain temps.

Il fonctionne pour moi:

 Get-ChildItem -Recurse -File | % { $tmp = Get-Content $_; $tmp | Out-File "$_" -Encoding UTF8 }

Qu'en est-ce (avec lookbehind négatif). Sans nonewline, set-contenu met `r`n supplémentaire au fond. Avec les parenthèses, vous pouvez modifier le même fichier.

function unix2dos {
    (Get-Content -raw $args[0]) -replace "(?<!`r)`n","`r`n" | 
    set-content -nonewline $args[0]
}

L'inverse serait cela, les fenêtres de texte unix.

function dos2unix {
    (Get-Content -raw $args[0]) -replace "`r`n","`n" | 
    set-content -nonewline $args[0]
}

Exemples:

unix2dos file.txt
dos2unix file.txt

Si vous avez emacs, vous pouvez vérifier avec esc-x hexl mode. Bloc-notes ne sera pas afficher le texte unix correctement. Je dois spécifier le chemin pour voir le contenu, car -replace efface le PSPath.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top