web-dev-qa-db-fra.com

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

Je dois convertir un répertoire entier en utilisant dos2unix. Je ne suis pas capable de comprendre comment faire cela.

274
Vivek Gaur

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

Trouvera récursivement tous les fichiers dans le répertoire en cours et appellera pour ces fichiers la commande dos2unix

495
CyberDem0n

S'il s'agit d'un répertoire volumineux, 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.

62
nikc

Dos2unix étant mal satisfait, j'ai lancé mon propre utilitaire simple. Outre quelques avantages en termes de rapidité et de prévisibilité, la syntaxe est aussi un peu plus simple:

endlines unix *

Et si vous voulez que cela tombe dans les sous-répertoires (en sautant les répertoires cachés et les fichiers non-textuels):

endlines unix -r .

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

22
Mathias Dolidon

Il est probablement préférable d’éviter les fichiers et dossiers cachés, tels que .git. Ainsi, au lieu d’utiliser find, si votre version de bash est suffisamment récente ou si vous utilisez zsh, il suffit de faire:

dos2unix **

Notez que pour Bash, cela nécessitera:

shopt -s globstar

.... mais c’est une fonctionnalité assez utile pour que vous deviez honnêtement la mettre dans votre .bashrc de toute façon.

Si vous ne le faites pas voulez ignorer les fichiers et les dossiers cachés, mais que vous ne voulez toujours pas jouer avec find (et que je ne vous blâme pas), vous pouvez en fournir une seconde. L'argument recursive-glob ne doit correspondre qu'à uniquement entrées masquées:

dos2unix ** **/.*

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

13
Kyle Strand

Pour tout utilisateur Solaris (utilisant la version 5.10, peut s’appliquer également aux versions les plus récentes, ainsi qu’à d’autres systèmes Unix):

dos2unix n'écrase pas le fichier par défaut. 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 {} {} \;
6
Brett

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

Merci à tous pour votre aide.

2
Strabek

Un cas d'utilisation courant semble être 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, *.bat), etc., ne sont que utilisés sur les systèmes d’exploitation Windows et devraient - garder la CRLF fin:

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

Si nécessaire, utilisez .gitattributes

2
friederbluemle
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done
2
rafapedroche

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

ls | xargs -I {} dos2unix "{}"
0