Situation suivante:
Je travaille sur un Mac sous OS X et j'ai récemment rejoint un projet dont les membres utilisent jusqu'à présent tous Windows. L'une de mes premières tâches a été de configurer la base de code dans un référentiel Git, j'ai donc extrait l'arborescence de répertoires de FTP et essayé de l'archiver dans le dépôt Git que j'avais préparé localement. En essayant de faire ça, tout ce que j'ai eu c'est ça
fatal: CRLF would be replaced by LF in blog/license.txt.
Puisque cela affecte tous les fichiers sous le dossier "blog", je cherche un moyen de convertir facilement TOUS les fichiers de l'arborescence en fins de ligne Unix. Existe-t-il un outil prêt à l'emploi ou est-ce que j'écris quelque chose moi-même?
Pour référence, ma configuration Git concernant les fins de ligne:
core.safecrlf=true
core.autocrlf=input
la source
find blog -type f | xargs dos2unix
devrait être plus rapide. Vous n'avez pas besoin non-name *.*
plus, à moins que vous ne vouliez spécifiquement des fichiers avec un point quelque part dans le nom. C'est un glob Windows, pas un * nix.find
versxargs
échouera sifind
correspond à des fichiers avec des espaces, des guillemets ou d'autres méta-caractères du shell dans leur chemin. Au moins utiliserfind blog -type f -print0 | xargs -0 dos2unix
pour gérer le cas des espaces. Vous devez utiliserfind
s-exec
au lieu de piping pour éviter les guillemets, etc. Lados2unix
page de manuel ne spécifie pas quel est son comportement si vous l'appelez sur des fichiers binaires. S'il convertit CRLF en fichiers binaires, il les corrompra. Voir ma réponse pour une alternative plus sûre, quoique plus longue.En supposant que vous avez GNU
grep
et queperl
cela convertira récursivement CRLF en LF dans des fichiers non binaires dans le répertoire actuel:Comment ça fonctionne
Rechercher récursivement dans le répertoire courant; changer
.
dansblog
ouwhatev
sous - répertoires pour limiter le remplacement:Ne correspond qu'aux fichiers normaux:
Testez si le fichier contient CRLF. Excluez les fichiers binaires. Exécute la
grep
commande pour chaque fichier normal. C'est le prix de l'exclusion des binaires. Si vous en avez un ancien,grep
vous pouvez essayer de construire un test en utilisant lafile
commande:Remplacez CRLF par LF. Le
'+'
avec le second-exec
indiquefind
d'accumuler les fichiers correspondants et de les passer à une (ou aussi peu que possible) invocations de la commande - comme le piping toxargs
, mais sans problème si le chemin du fichier contient des espaces, des guillemets ou d'autres méta caractères du shell. Lei
in-pi
indique à perl de modifier le fichier en place. Vous pourriez utilisersed
ouawk
ici avec un peu de travail, et vous changerez probablement '+' en ';' et invoquez un processus distinct pour chaque correspondance:la source
grep -qIP '\r\n'
ne correspond jamais à rien sur mon système CentOS. Changer cela agrep -qIP '\r$'
fonctionné.node_modules
?find
partie de la commande pour exclure des répertoires. Ils suggèrent d'utiliser-path
, mais vous pouvez également utiliser-regex
ou-iregex
, c'est-à-dire-not -regex '.*/node_modules/.*'
qui exclura unnode_modules
à n'importe quelle profondeur.regex
ou unbash
noob, mais qu'en est-il des exclusions multiples, disonsnode_module
etdist
par exemple?-P
drapeau. OS X est passé de GNU grep à BSD grep. Quelques alternatives pour OS X: stackoverflow.com/questions/16658333/…Voici une meilleure option: Swiss File Knife . Il fonctionne de manière récursive dans les sous-répertoires et gère correctement les espaces et les caractères spéciaux.
Tout ce que tu dois faire est:
Bonus: sfk effectue également de nombreuses autres conversions. Voir ci-dessous pour la liste complète:
EDIT: un mot d'avertissement: soyez prudent lorsque vous l'exécutez sur des dossiers contenant des fichiers binaires, car cela détruira efficacement vos fichiers, en particulier les répertoires .git . Si tel est votre cas, n'exécutez pas sfk dans tout le dossier, mais sélectionnez plutôt des extensions de fichier spécifiques (* .rb, * .py, etc.). Exemple:
sfk remcr -dir chef -file .rb -file .json -file .erb -file .md
la source
sfk
j'ai traité efficacement tout mon dossier .git et détruit un tas de binaires (d'où ma modification ; je ne me souviens pas si c'était Linux ou Mac). Ils ont peut-être changé le comportement par défaut dans les versions plus récentes, mais je recommanderais quand même de spécifier l'extension, pour être sûr.C'est beaucoup plus sûr car cela évite de corrompre votre dépôt git. Ajoutez ou remplacez .git, .svn par .bzr, .hg ou tout autre contrôle de source que vous utilisez dans la liste non .
la source
Sur OS X, cela a fonctionné pour moi:
Attention: veuillez sauvegarder votre répertoire avant d'exécuter cette commande.
la source
Voici une solution si vous utilisez sed:
-i
signifie en place, si vous souhaitez créer une sauvegarde, utilisez également-i.bak
's/\r$//'
remplacera tous les retours chariot (\r
) à la fin de chaque lignela source