Je dois convertir un répertoire entier en utilisant dos2unix
. Je ne suis pas capable de comprendre comment faire cela.
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
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.
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
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.
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 {} {} \;
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.
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
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
S'il n'y a pas de sous-répertoire, vous pouvez aussi prendre
ls | xargs -I {} dos2unix "{}"