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
find
invocation ne fait pas cette vérification (bien que ce soit assez simple à ajouter), mais les dos2unix
sauts 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.
n
remonterais 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 .
endlines
est 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 dos2unix
sont 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 bash
version 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.
dos2unix
alias qui affecte la façon dont les arguments sont développés. Quelle est la sortie de type dos2unix
sur votre système?
**
au lieu de find
est de "sauter les fichiers et dossiers cachés, tels que .git
". dos2unix
ne voit jamais les fichiers cachés, car **
ne se développe pas pour les afficher. Si vous souhaitez exécuter automatiquement dos2unix
les fichiers et dossiers cachés, vous pouvez utiliser find
ou 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.
dos2unix
s'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 ls
avec un glob n'est pas un bon moyen de vérifier comment le glob est développé; utiliser à la echo
place: echo **
affichera les arguments dos2unix
reçus de dos2unix **
.
**
que cela impliquait, et l'utilisation le echo
rend 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
, *.bat
etc.) ne sont utilisés que sur les systèmes d'exploitation Windows et doivent garder la CRLF
fin:
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.
.bashrc
ou .profile
ou quoi
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
Usage
$ dos2unixd ./somepath
De cette façon, vous avez toujours la commande d'origine dos2unix
et 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 dos2unix
résoudrait le problème, je pense.