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
find
Aufruf 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.
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:
endlines unix *
Und wenn Sie möchten, dass es in Unterverzeichnisse verschoben wird (übersprungene Verzeichnisse und Nicht-Textdateien überspringen):
endlines unix -r .
endlines
ist hier verfügbar unter https://github.com/mdolidon/endlines
dos2unix
? Wirklich neugierig.
dos2unix
mit 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 dos2unix
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 verwenden find
, wenn Ihre bash
Version 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 .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:
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.
dos2unix
Alias haben, der sich auf die Erweiterung der Argumente auswirkt. Was ist die Ausgabe type dos2unix
auf Ihrem System?
**
anstelle von find
"ü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ührt dos2unix
auf versteckte Dateien und Ordner, die Sie verwenden können find
oder dos2unix ** **/.*
die **/.*
expandieren nur die versteckten Dateien und Ordner, einschließlich .
(Root - Verzeichnis), ..
(das Elternverzeichnis) und alle anderen versteckten Einträge im aktuellen Ordner.
dos2unix
Drucken 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 ls
mit einem Glob keine gute Möglichkeit, um zu überprüfen, wie der Glob erweitert wird. Verwenden Sie echo
stattdessen: echo **
Gibt die Argumente aus, dos2unix
die von empfangen werden dos2unix **
.
**
impliziert wurde, und die Verwendung echo
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 :
git ls-files | xargs dos2unix
Beachten Sie, dass bestimmte Dateien (zB *.sln
, *.bat
) etc. sind nur auf Windows - Betriebssystemen verwendet und sollte halten die CRLF
Endung:
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.
.bashrc
oder .profile
oder 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 dos2unix
und 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 dos2unix
würde das Problem lösen, denke ich.