Je dois convertir un répertoire entier en utilisant dos2unix. Je ne suis pas en mesure de comprendre comment procéder.
Je dois convertir un répertoire entier en utilisant dos2unix. Je ne suis pas en mesure de comprendre comment procéder.
Réponses:
find . -type f -print0 | xargs -0 dos2unix
Recherche récursivement tous les fichiers dans le répertoire courant et appelle ces fichiers. Commande dos2unix
\;; echo Hello
findinvocation ne fait pas cette vérification (bien que ce soit assez simple à ajouter), mais les dos2unixsauts de fichiers binaires sont corrects.
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.
nremonterais cela d'un ordre de grandeur ou deux (selon le nombre de fichiers dont nous parlons ici)
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
dos2unix? Vraiment curieux.
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.
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.
dos2unixalias qui affecte la façon dont les arguments sont développés. Quelle est la sortie de type dos2unixsur votre système?
**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.
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 **.
**que cela impliquait, et l'utilisation le echorend clair.
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
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 {} {} \;
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
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.
S'il n'y a pas de sous-répertoire, vous pouvez également prendre
ls | xargs -I {} dos2unix "{}"
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.)
find . -type f -print0 | xargs -0 dos2unixrésoudrait le problème, je pense.