Ich muss ein ganzes Verzeichnis mit konvertieren dos2unix. Ich kann nicht herausfinden, wie das geht.
Ich muss ein ganzes Verzeichnis mit konvertieren dos2unix. Ich kann nicht herausfinden, wie das geht.
Antworten:
find . -type f -print0 | xargs -0 dos2unix
Findet rekursiv alle Dateien im aktuellen Verzeichnis und ruft den Befehl dos2unix für diese Dateien auf
\;; echo Hello
findAufruf führt diese Prüfung nicht durch (obwohl das Hinzufügen einfach genug wäre), aber modern dos2unixüberspringt Binärdateien korrekt.
Wenn es sich um ein großes Verzeichnis handelt, sollten Sie in Betracht ziehen, es mit mehreren Prozessoren auszuführen:
find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix
Dadurch wird jeweils 1 Datei übergeben und 4 Prozessoren verwendet.
num 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:
endlines unix *
Und wenn Sie möchten, dass es in Unterverzeichnisse verschoben wird (übersprungene Verzeichnisse und Nicht-Textdateien überspringen):
endlines unix -r .
endlinesist hier verfügbar unter https://github.com/mdolidon/endlines
dos2unix? Wirklich neugierig.
dos2unixmit unterschiedlichen Funktionen (einige lesen beispielsweise UTF32, andere nicht; Endlinien nicht). Es gibt nur eine endlines, deren Fähigkeiten bekannt sind. 2 / liberal auf Input, nicht alle dos2unixsind. 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 verwenden find, wenn Ihre bashVersion aktuell genug ist oder wenn Sie verwenden zsh, tun Sie einfach Folgendes:
dos2unix **
Beachten Sie, dass für Bash Folgendes erforderlich ist:
shopt -s globstar
.... aber dies ist eine Funktion, die nützlich genug ist, dass Sie sie ehrlich gesagt .bashrctrotzdem 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:
dos2unix ** **/.*
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.
dos2unixAlias haben, der sich auf die Erweiterung der Argumente auswirkt. Was ist die Ausgabe type dos2unixauf Ihrem System?
**anstelle von find"übersprungene Dateien und Ordner wie .git" übersprungen wird . dos2unixsieht die versteckten Dateien nie, weil **sie nicht erweitert werden, um sie anzuzeigen. Wenn Sie wollen , automatisch ausgeführt dos2unixauf versteckte Dateien und Ordner, die Sie verwenden können findoder dos2unix ** **/.*die **/.*expandieren nur die versteckten Dateien und Ordner, einschließlich .(Root - Verzeichnis), ..(das Elternverzeichnis) und alle anderen versteckten Einträge im aktuellen Ordner.
dos2unixDrucken Skipping <dir>, not a regular file.in einem Verzeichnis einfach gedruckt wird, also ausgeführt wird ..und .sicher ist.) Darüber hinaus ist die Kombination lsmit einem Glob keine gute Möglichkeit, um zu überprüfen, wie der Glob erweitert wird. Verwenden Sie echostattdessen: echo **Gibt die Argumente aus, dos2unixdie von empfangen werden dos2unix **.
**impliziert wurde, und die Verwendung echomacht es klar.
Ein häufiger Anwendungsfall scheint darin zu bestehen, Zeilenenden für alle Dateien zu standardisieren, die an ein Git-Repository übergeben werden :
git ls-files | xargs dos2unix
Beachten Sie, dass bestimmte Dateien (zB *.sln, *.bat) etc. sind nur auf Windows - Betriebssystemen verwendet und sollte halten die CRLFEndung:
git ls-files '*.sln' '*.bat' | xargs unix2dos
Falls erforderlich, verwenden .gitattributes
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:
find . -type f -exec dos2unix {} {} \;
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
Ich habe das wie eine Million Mal gegoogelt, daher besteht meine Lösung darin, diese Bash-Funktion einfach in Ihre Umgebung zu integrieren.
.bashrcoder .profileoder was auch immer
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
Verwendungszweck
$ dos2unixd ./somepath
Auf diese Weise haben Sie immer noch den ursprünglichen Befehl dos2unixund es ist einfach, sich an diesen zu erinnern dos2unixd.
Wenn es kein Unterverzeichnis gibt, können Sie auch nehmen
ls | xargs -I {} dos2unix "{}"
dos2unix *ist dies einfacher und tatsächlich robuster. (Es wird im Allgemeinen nicht empfohlen, die Ausgabe von zu leiten ls, da es sich um ein Formatierungswerkzeug handelt und *für die programmatische Verwendung zuverlässiger ist.)
find . -type f -print0 | xargs -0 dos2unixwürde das Problem lösen, denke ich.