Comment puis-je exécuter dos2unix sur un répertoire entier? [fermé]

333

Je dois convertir un répertoire entier en utilisant dos2unix. Je ne suis pas en mesure de comprendre comment procéder.

Vivek Gaur
la source

Réponses:

591

find . -type f -print0 | xargs -0 dos2unix

Recherche récursivement tous les fichiers dans le répertoire courant et appelle ces fichiers. Commande dos2unix

CyberDem0n
la source
94
Se briserait si vous aviez des espaces dans le nom de fichier. find . -type f -print0 | xargs -0 dos2unixrésoudrait le problème, je pense.
Noufal Ibrahim
1
j'ai donné comme cette trouvaille. -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src et il a donné l'erreur find: argument manquant à `-exec '
Vivek Gaur
1
Notez que la barre oblique inversée qui échappe au point-virgule garantit que les commandes dos2unix sont séparées par des points-virgules afin qu'elles ne finissent pas en purée ensemble. Si vous souhaitez exécuter une autre commande par la suite, vous aurez besoin d'un autre point-virgule, donc\;; echo Hello
Josh
1
Soyez prudent avec cette commande cependant, elle ne vérifie pas si le fichier a besoin de la conversion, donc même les fichiers binaires seront "convertis", les corrompant.
vguzmanp
2
@vguzmanp Certes, l' findinvocation ne fait pas cette vérification (bien que ce soit assez simple à ajouter), mais les dos2unixsauts de fichiers binaires sont corrects.
Kyle Strand
68

S'il s'agit d'un grand répertoire, vous pouvez envisager de l'exécuter avec plusieurs processeurs:

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix 

Cela passera 1 fichier à la fois et utilisera 4 processeurs.

nikc
la source
1
Cette méthode a l'avantage qu'elle continue, même si dos2unix rencontre des problèmes! Quelque chose comme une méthode "--force". Merci pour ça!
freeo
Wow - vient de m'économiser beaucoup de temps pour résoudre les problèmes tout en essayant de convertir un ajout de code de développeur Windows qui avait un lit ajouté à git incorrectement. Je vous remercie!!
Le NetYeti
1
Le démarrage d'un nouveau processus dos2unix pour chaque fichier individuel entraînera une surcharge massivement inutile. Je nremonterais cela d'un ordre de grandeur ou deux (selon le nombre de fichiers dont nous parlons ici)
JonoCoetzee
25

Comme il m'est arrivé d'être peu satisfait par dos2unix, j'ai déployé mon propre utilitaire simple. Outre quelques avantages en termes de vitesse et de prévisibilité, la syntaxe est également un peu plus simple:

endlines unix *

Et si vous voulez qu'il descende dans les sous-répertoires (en ignorant les répertoires cachés et les fichiers non textuels):

endlines unix -r .

endlinesest disponible ici https://github.com/mdolidon/endlines

Mathias Dolidon
la source
1
C'est parfait! Le one-liner le plus proche que j'ai pu trouver ici est ici: unix.stackexchange.com/a/365679/112190
phyatt
2
Comment cela s'améliore-t-il dos2unix? Vraiment curieux.
Walf
3
1 / Surtout, il y a des tonnes de différents dos2unix, avec des capacités variables (certains lisent UTF32 par exemple, tandis que d'autres ne le font pas; endlines ne le fait pas). Il n'y en a qu'un endlines, dont les capacités sont bien connues. 2 / libéral en entrée, tous ne le dos2unixsont pas. 3 / Exploration efficace de l'arborescence des fichiers, conçue pour être rapide et pratique sur des dizaines de milliers de fichiers. 4 / ne fonctionne plus sous OSX - ce qui est moins important maintenant que le package Brew existe.
Mathias Dolidon
1
Dans mon cas, c'est exactement ce dont j'avais besoin, merci beaucoup. Les fonctionnalités bienvenues sont le moyen facile de traiter une arborescence de répertoires et le temps d'exécution rapide.
AlSavi
17

Il est probablement préférable d'ignorer les fichiers et dossiers cachés, tels que .git.So au lieu d'utiliser find, si votre bashversion est assez récente ou si vous utilisez zsh, faites simplement:

dos2unix **

Notez que pour Bash, cela nécessitera:

shopt -s globstar

.... mais c'est une fonctionnalité suffisamment utile pour que vous puissiez honnêtement la mettre dans votre .bashrc toute façon.

Si vous ne voulez pas ignorer les fichiers et dossiers cachés, mais que vous ne voulez toujours pas jouer avec find(et je ne vous en voudrais pas), vous pouvez fournir un deuxième argument récursif-glob pour ne faire correspondre que les entrées cachées:

dos2unix ** **/.*

Notez que dans les deux cas, le glob se développera pour inclure les répertoires, vous verrez donc l'avertissement suivant (potentiellement plusieurs fois): Skipping <dir>, not a regular file.

Kyle Strand
la source
1
Ça n'a pas marché pour moi. La syntaxe globstar fonctionne-t-elle pour dos2unix? J'ai utilisé globstar ailleurs avec succès, mais je n'ai pas réussi à le faire fonctionner. J'utilise Bash 4.3.11 (1)
NS du Toit
@NSduToit * Les shells de style NIX ne permettent pas aux exécutables de modifier le comportement de l'expansion d'arguments, car (contrairement à Windows) l'expansion d'arguments est effectuée avant que l'exécutable ne reçoive jamais les arguments. Donc, la seule chose à laquelle je peux penser est que vous avez une sorte d' dos2unixalias qui affecte la façon dont les arguments sont développés. Quelle est la sortie de type dos2unixsur votre système?
Kyle Strand
1
@NSduToit Il y a une certaine confusion ici. Ma réponse indique explicitement que le point d'utilisation **au lieu de findest de "sauter les fichiers et dossiers cachés, tels que .git". dos2unixne voit jamais les fichiers cachés, car **ne se développe pas pour les afficher. Si vous souhaitez exécuter automatiquement dos2unixles fichiers et dossiers cachés, vous pouvez utiliser findou dos2unix ** **/.*Le **/.*développera uniquement les fichiers et dossiers cachés, y compris .(le répertoire racine), ..(le répertoire parent) et toutes les autres entrées masquées du dossier actuel.
Kyle Strand
1
(Notez que dos2unixs'imprime simplement Skipping <dir>, not a regular file.lorsqu'il est exécuté sur un répertoire, donc il s'exécute ..et .est sûr.) De plus, la combinaison lsavec un glob n'est pas un bon moyen de vérifier comment le glob est développé; utiliser à la echoplace: echo **affichera les arguments dos2unixreçus de dos2unix **.
Kyle Strand
1
Je vous remercie! Logique! D'accord, j'avais une idée totalement fausse de ce **que cela impliquait, et l'utilisation le echorend clair.
NS du Toit
7

Un cas d'utilisation courant semble être de normaliser les fins de ligne pour tous les fichiers validés dans un référentiel Git :

git ls-files | xargs dos2unix

Gardez à l'esprit que certains fichiers (par exemple *.sln, *.batetc.) ne sont utilisés que sur les systèmes d'exploitation Windows et doivent garder la CRLFfin:

git ls-files '*.sln' '*.bat' | xargs unix2dos

Si nécessaire, utilisez .gitattributes

friederbluemle
la source
6

Pour tous les utilisateurs de Solaris (j'utilise 5.10, peut également s'appliquer aux versions plus récentes, ainsi qu'à d'autres systèmes Unix):

dos2unix ne remplace pas par défaut le fichier, il imprimera simplement la version mise à jour sur stdout, vous devrez donc spécifier la source et la cible, c'est-à-dire le même nom deux fois:

find . -type f -exec dos2unix {} {} \;
Brett
la source
2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done
rafapedroche
la source
1
Bienvenue dans Stack Overflow. Bien que votre solution soit une solution valide, ce serait formidable si vous pouviez y ajouter des explications. Vous pouvez également envisager de référencer d'autres réponses pour justifier votre réponse. Veuillez consulter Comment répondre pour plus d'informations.
kvantour
2

J'ai eu le même problème et grâce aux messages ici, je l'ai résolu. Je savais que j'avais environ une centaine de fichiers et je devais l'exécuter uniquement pour les fichiers * .js. find . -type f -name '*.js' -print0 | xargs -0 dos2unix

Merci à tous pour votre aide.

Strabek
la source
0

Je pense que la manière la plus simple est:

dos2unix $(find . -type f)
Sahand
la source
0

J'ai googlé cela comme un million de fois, donc ma solution est de simplement mettre cette fonction bash dans votre environnement.

.bashrcou .profileou quoi

dos2unixd() {
  find $1 -type f -print0 | xargs -0 dos2unix
}

Usage

$ dos2unixd ./somepath

De cette façon, vous avez toujours la commande d'origine dos2unixet il est facile de se souvenir de celle-ci dos2unixd.

Ben Winding
la source
-1

S'il n'y a pas de sous-répertoire, vous pouvez également prendre

ls | xargs -I {} dos2unix "{}"
Summer_More_More_Tea
la source
4
S'il n'y a pas de sous-répertoires, dos2unix *c'est plus simple et sera en fait plus robuste que cela. (Il n'est généralement pas recommandé de diriger la sortie de ls, car c'est un outil de formatage et *est plus fiable pour une utilisation programmatique.)
Kyle Strand