Wie kann ich dos2unix für ein gesamtes Verzeichnis ausführen? [geschlossen]

332

Ich muss ein ganzes Verzeichnis mit konvertieren dos2unix. Ich kann nicht herausfinden, wie das geht.

Vivek Gaur
quelle

Antworten:

589

find . -type f -print0 | xargs -0 dos2unix

Findet rekursiv alle Dateien im aktuellen Verzeichnis und ruft den Befehl dos2unix für diese Dateien auf

CyberDem0n
quelle
94
Würde brechen, wenn Sie Leerzeichen im Dateinamen hätten. find . -type f -print0 | xargs -0 dos2unixwürde das Problem lösen, denke ich.
Noufal Ibrahim
1
Ich gab wie dieser Fund. -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src und es gab den Fehler find: fehlendes Argument zu `-exec '
Vivek Gaur
1
Beachten Sie, dass der Backslash, der dem Semikolon entgeht, sicherstellt, dass die dos2unix-Befehle durch Semikolons getrennt sind, damit sie nicht zusammengefügt werden. Wenn Sie danach einen weiteren Befehl ausführen möchten, benötigen Sie ein weiteres \;; echo Hello
Josh
1
Seien Sie vorsichtig mit diesem Befehl, er prüft nicht, ob die Datei konvertiert werden muss, sodass selbst Binärdateien "konvertiert" werden und diese beschädigen.
Vguzmanp
2
@vguzmanp Richtig, der findAufruf führt diese Prüfung nicht durch (obwohl das Hinzufügen einfach genug wäre), aber modern dos2unixüberspringt Binärdateien korrekt.
Kyle Strand
67

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.

nikc
quelle
1
Diese Methode hat den Vorteil, dass sie fortgesetzt wird, obwohl dos2unix auf Probleme stößt! So etwas wie eine "--force" -Methode. Danke für das!
Freeo
Wow - ich habe gerade viel Zeit beim Lösen von Problemen gespart, als ich versucht habe, Code-Ergänzungen für Windows-Entwickler zu konvertieren, bei denen das Bett falsch zu Git hinzugefügt wurde. Vielen Dank!!
Die NetYeti
1
Das Starten eines neuen dos2unix-Prozesses für jede einzelne Datei führt zu einem enorm unnötigen Overhead. Ich würde das num eine Größenordnung oder zwei erhöhen (abhängig davon, wie viele Dateien wir hier sprechen)
JonoCoetzee
25

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

Mathias Dolidon
quelle
1
Dies ist perfekt! Der nächste Einzeiler, den
Phyatt
2
Wie verbessert es sich dos2unix? Wirklich neugierig.
Walf
3
1 / Hauptsächlich gibt es Unmengen verschiedener Funktionen 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.
Mathias Dolidon
1
In meinem Fall ist es genau das, was ich brauchte, vielen Dank. Funktionen, die willkommen sind, sind die einfache Möglichkeit, einen Verzeichnisbaum zu verarbeiten, und die schnelle Ausführungszeit.
AlSavi
17

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.

Kyle Strand
quelle
1
Das hat bei mir nicht funktioniert. Funktioniert die Globstar-Syntax für dos2unix? Ich habe Globstar anderswo mit Erfolg eingesetzt, konnte dies aber nicht zum Laufen bringen. Ich benutze Bash 4.3.11 (1)
NS du Toit
@NSduToit * NIX-Shells erlauben es ausführbaren Dateien nicht, das Verhalten der Argumenterweiterung zu ändern, da (anders als in Windows) die Argumenterweiterung durchgeführt wird, bevor die ausführbare Datei jemals die Argumente empfängt. Ich kann mir also nur vorstellen, dass Sie einen dos2unixAlias ​​haben, der sich auf die Erweiterung der Argumente auswirkt. Was ist die Ausgabe type dos2unixauf Ihrem System?
Kyle Strand
1
@NSduToit Hier gibt es einige Verwirrung. In meiner Antwort heißt es ausdrücklich, dass der Sinn der Verwendung **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.
Kyle Strand
1
(Beachten Sie, dass beim 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 **.
Kyle Strand
1
Vielen Dank! Macht Sinn! Okay, ich hatte eine völlig falsche Vorstellung davon, was **impliziert wurde, und die Verwendung echomacht es klar.
NS du Toit
7

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

friederbluemle
quelle
6

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 {} {} \;
Brett
quelle
2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done
rafapedroche
quelle
1
Willkommen bei Stack Overflow. Obwohl Ihre Lösung eine gültige Lösung ist, wäre es großartig, wenn Sie eine Erklärung hinzufügen könnten. Sie können auch andere Antworten referenzieren, um Ihre Antwort zu rechtfertigen. Bitte haben Sie einen Blick auf wie man Antwort für weitere Informationen.
kvantour
2

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.

Strabek
quelle
0

Ich denke, der einfachste Weg ist:

dos2unix $(find . -type f)
Sahand
quelle
0

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.

Ben Winding
quelle
-1

Wenn es kein Unterverzeichnis gibt, können Sie auch nehmen

ls | xargs -I {} dos2unix "{}"
Summer_More_More_Tea
quelle
4
Wenn es keine Unterverzeichnisse gibt, 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.)
Kyle Strand