Ich muss ein ganzes Verzeichnis mit konvertieren dos2unix
. Ich kann nicht herausfinden, wie das geht.
332
find . -type f -print0 | xargs -0 dos2unix
Findet rekursiv alle Dateien im aktuellen Verzeichnis und ruft den Befehl dos2unix für diese Dateien auf
find . -type f -print0 | xargs -0 dos2unix
würde das Problem lösen, denke ich.\;; echo Hello
find
Aufruf führt diese Prüfung nicht durch (obwohl das Hinzufügen einfach genug wäre), aber moderndos2unix
überspringt Binärdateien korrekt.Wenn es sich um ein großes Verzeichnis handelt, sollten Sie in Betracht ziehen, es mit mehreren Prozessoren auszuführen:
Dadurch wird jeweils 1 Datei übergeben und 4 Prozessoren verwendet.
quelle
n
um eine Größenordnung oder zwei erhöhen (abhängig davon, wie viele Dateien wir hier sprechen)Da ich mit dos2unix schlecht zufrieden war, habe ich mein eigenes einfaches Dienstprogramm eingeführt. Abgesehen von einigen Vorteilen in Bezug auf Geschwindigkeit und Vorhersagbarkeit ist die Syntax auch etwas einfacher:
Und wenn Sie möchten, dass es in Unterverzeichnisse verschoben wird (übersprungene Verzeichnisse und Nicht-Textdateien überspringen):
endlines
ist hier verfügbar unter https://github.com/mdolidon/endlinesquelle
dos2unix
? Wirklich neugierig.dos2unix
mit unterschiedlichen Funktionen (einige lesen beispielsweise UTF32, andere nicht; Endlinien nicht). Es gibt nur eineendlines
, deren Fähigkeiten bekannt sind. 2 / liberal auf Input, nicht alledos2unix
sind. 3 / Effiziente Dateibaumerkundung, die für Zehntausende von Dateien schnell und praktisch ist. 4 / läuft unter OSX sofort aus - was jetzt, da das Brew-Paket existiert, weniger wichtig ist.Es ist wahrscheinlich am besten, versteckte Dateien und Ordner zu überspringen, z. B.
.git.
Also, anstatt zu verwendenfind
, wenn Ihrebash
Version aktuell genug ist oder wenn Sie verwendenzsh
, tun Sie einfach Folgendes:Beachten Sie, dass für Bash Folgendes erforderlich ist:
.... aber dies ist eine Funktion, die nützlich genug ist, dass Sie sie ehrlich gesagt
.bashrc
trotzdem in Ihre Funktion aufnehmen sollten .Wenn Sie versteckte Dateien und Ordner nicht überspringen möchten, sich aber dennoch nicht damit anlegen möchten
find
(und ich würde Ihnen keine Vorwürfe machen), können Sie ein zweites rekursives Glob-Argument angeben, das nur versteckten Einträgen entspricht:Beachten Sie, dass in beiden Fällen der Glob um Verzeichnisse erweitert wird, sodass die folgende Warnung angezeigt wird (möglicherweise um ein Vielfaches):
Skipping <dir>, not a regular file.
quelle
dos2unix
Alias haben, der sich auf die Erweiterung der Argumente auswirkt. Was ist die Ausgabetype dos2unix
auf Ihrem System?**
anstelle vonfind
"übersprungene Dateien und Ordner wie.git
" übersprungen wird .dos2unix
sieht die versteckten Dateien nie, weil**
sie nicht erweitert werden, um sie anzuzeigen. Wenn Sie wollen , automatisch ausgeführtdos2unix
auf versteckte Dateien und Ordner, die Sie verwenden könnenfind
oderdos2unix ** **/.*
die**/.*
expandieren nur die versteckten Dateien und Ordner, einschließlich.
(Root - Verzeichnis),..
(das Elternverzeichnis) und alle anderen versteckten Einträge im aktuellen Ordner.dos2unix
DruckenSkipping <dir>, not a regular file.
in einem Verzeichnis einfach gedruckt wird, also ausgeführt wird..
und.
sicher ist.) Darüber hinaus ist die Kombinationls
mit einem Glob keine gute Möglichkeit, um zu überprüfen, wie der Glob erweitert wird. Verwenden Sieecho
stattdessen:echo **
Gibt die Argumente aus,dos2unix
die von empfangen werdendos2unix **
.**
impliziert wurde, und die Verwendungecho
macht es klar.Ein häufiger Anwendungsfall scheint darin zu bestehen, Zeilenenden für alle Dateien zu standardisieren, die an ein Git-Repository übergeben werden :
Beachten Sie, dass bestimmte Dateien (zB
*.sln
,*.bat
) etc. sind nur auf Windows - Betriebssystemen verwendet und sollte halten dieCRLF
Endung:Falls erforderlich, verwenden
.gitattributes
quelle
Für alle Solaris-Benutzer (verwende 5.10, gilt möglicherweise auch für neuere Versionen sowie andere Unix-Systeme):
dos2unix überschreibt die Datei nicht standardmäßig, sondern druckt nur die aktualisierte Version in stdout, sodass Sie die Quelle und das Ziel angeben müssen, dh zweimal denselben Namen:
quelle
quelle
Ich hatte das gleiche Problem und dank der Beiträge hier habe ich es gelöst. Ich wusste, dass ich ungefähr hundert Dateien habe und ich musste es nur für * .js-Dateien ausführen.
find . -type f -name '*.js' -print0 | xargs -0 dos2unix
Vielen Dank für Ihre Hilfe.
quelle
Ich denke, der einfachste Weg ist:
quelle
Ich habe das wie eine Million Mal gegoogelt, daher besteht meine Lösung darin, diese Bash-Funktion einfach in Ihre Umgebung zu integrieren.
.bashrc
oder.profile
oder was auch immerVerwendungszweck
$ dos2unixd ./somepath
Auf diese Weise haben Sie immer noch den ursprünglichen Befehl
dos2unix
und es ist einfach, sich an diesen zu erinnerndos2unixd
.quelle
Wenn es kein Unterverzeichnis gibt, können Sie auch nehmen
quelle
dos2unix *
ist dies einfacher und tatsächlich robuster. (Es wird im Allgemeinen nicht empfohlen, die Ausgabe von zu leitenls
, da es sich um ein Formatierungswerkzeug handelt und*
für die programmatische Verwendung zuverlässiger ist.)ls
nicht gut sind