it-swarm.com.de

Wie entferne ich rekursiv abschließende Leerzeichen aller Dateien?

Wie können Sie alle nachgestellten Leerzeichen eines gesamten Projekts entfernen? Beginnen Sie mit einem Stammverzeichnis und entfernen Sie das nachfolgende Leerzeichen aus allen Dateien in allen Ordnern.

Außerdem möchte ich in der Lage sein, die Datei direkt zu ändern und nicht nur alles auf stdout zu drucken.

118
iamjwc

Hier ist eine OS X> = 10.6 Snow Leopard-Lösung.

Ignoriert die Ordner .git und .svn und deren Inhalt. Außerdem hinterlässt es keine Sicherungsdatei.

export LC_CTYPE=C
export LANG=C
find . -not \( -name .svn -Prune -o -name .git -Prune \) -type f -print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"
82
deepwell

Verwenden:

find . -type f -print0 | xargs -0 Perl -pi.bak -e 's/ +$//'

wenn Sie nicht möchten, dass die ".bak" -Dateien generiert werden:

find . -type f -print0 | xargs -0 Perl -pi -e 's/ +$//'

als zsh-Benutzer können Sie den Aufruf von find weglassen und stattdessen Folgendes verwenden:

Perl -pi -e 's/ +$//' **/*

Hinweis: Um zu verhindern, dass das Verzeichnis .git Zerstört wird, fügen Sie Folgendes hinzu: -not -iwholename '*.git*'.

29
Sec

Zwei alternative Ansätze, die auch mit DOS-Zeilenumbrüchen (CR/LF) funktionieren und bei der Vermeidung von Binärdateien ziemlich gute Arbeit leisten Dateien :

generische Lösung prüft, ob der MIME-Typ mit text/ Beginnt:

while IFS= read -r -d '' -u 9
do
    if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
    then
        sed -i 's/[ \t]\+\(\r\?\)$/\1/' -- "$REPLY"
    else
        echo "Skipping $REPLY" >&2
    fi
done 9< <(find . -type f -print0)

Git-Repository-spezifische Lösung von Mat, die die Option -I Von git grep Verwendet, um Dateien überspringen, die Git als binär ansieht:

git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'
27
l0b0

In Bash:

find dir -type f -exec sed -i 's/ *$//' '{}' ';'

Hinweis: Wenn Sie das Repository .git Verwenden, fügen Sie Folgendes hinzu: -not -iwholename '.git'.

22
Adam Rosenfield

Dies funktionierte für mich in OSX 10.5 Leopard, das weder GNU sed noch xargs verwendet.

find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"

Seien Sie vorsichtig damit, wenn Sie Dateien haben, die ausgeschlossen werden müssen (ich habe es getan)!

Mit -Prune können Sie bestimmte Verzeichnisse oder Dateien ignorieren. Für Python -Dateien in einem Git-Repository können Sie Folgendes verwenden:

find dir -not -path '.git' -iname '*.py'
14
pojo

Ack wurde für diese Art von Aufgabe gemacht.

Es funktioniert genau wie grep, weiß aber nicht, wie man in Orte wie .svn, .git, .cvs usw. abtaucht.

ack --print0 -l '[ \t]+$' | xargs -0 -n1 Perl -pi -e 's/[ \t]+$//'

Viel einfacher als mit find/grep durch Reifen zu springen.

Ack ist über die meisten Paketmanager verfügbar (entweder als ack oder ack-grep ).

Es ist nur ein Perl-Programm, daher ist es auch in einer Einzeldateiversion verfügbar, die Sie einfach herunterladen und ausführen können. Siehe: Ack Install

9
jbbuckley

ex

Versuchen Sie es mit Ex-Editor (Teil von Vim):

$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*

Hinweis: Für die Rekursion (bash4 & zsh) verwenden wir eine neue Globbing-Option (**/*.*). Aktivieren mit shopt -s globstar.

Sie können die folgende Funktion in Ihren .bash_profile Einfügen:

# Strip trailing whitespaces.
# Usage: trim *.*
# See: https://stackoverflow.com/q/10711051/55075
trim() {
  ex +'bufdo!%s/\s\+$//e' -cxa $*
}

sed

Um sed zu verwenden, überprüfen Sie: Wie entferne ich abschließende Leerzeichen mit sed?

find

Suchen Sie das folgende Skript (z. B. remove_trail_spaces.sh), Um nachfolgende Leerzeichen aus den Dateien zu entfernen:

#!/bin/sh
# Script to remove trailing whitespace of all files recursively
# See: https://stackoverflow.com/questions/149057/how-to-remove-trailing-whitespace-of-all-files-recursively

case "$OSTYPE" in
  darwin*) # OSX 10.5 Leopard, which does not use GNU sed or xargs.
    find . -type f -not -iwholename '*.git*' -print0  | xargs -0 sed -i .bak -E "s/[[:space:]]*$//"
    find . -type f -name \*.bak -print0 | xargs -0 rm -v
    ;;
  *)
    find . -type f -not -iwholename '*.git*' -print0 | xargs -0 Perl -pi -e 's/ +$//'
esac

Führen Sie dieses Skript aus dem Verzeichnis aus, das Sie durchsuchen möchten. Unter OSX werden am Ende alle Dateien entfernt, die mit .bak Enden.

Oder nur:

find . -type f -name "*.Java" -exec Perl -p -i -e "s/[ \t]$//g" {} \;

was übrigens von Spring Framework Code Style empfohlen wird.

7
kenorb

Anstatt Dateien auszuschließen, finden Sie hier eine Variation der oben genannten explizit weißen Listen der Dateien, basierend auf der Dateierweiterung, die Sie entfernen möchten.

find . \( -name *.rb -or -name *.html -or -name *.js -or -name *.coffee -or \
-name *.css -or -name *.scss -or -name *.erb -or -name *.yml -or -name *.ru \) \
-print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"
6
ChicagoBob

Am Ende habe ich find nicht verwendet und keine Sicherungsdateien erstellt.

sed -i '' 's/[[:space:]]*$//g' **/*.*

Je nach Tiefe des Dateibaums kann dies (kürzere Version) für Ihre Anforderungen ausreichend sein.

HINWEIS Dazu gehören beispielsweise auch Binärdateien.

6

Am Ende habe ich dies ausgeführt, eine Mischung aus Pojo und Adams Version.

Es wird sowohl das nachfolgende Leerzeichen als auch eine andere Form des nachfolgenden Leerzeichens, das Carriage Return, bereinigen:

find . -not \( -name .svn -Prune -o -name .git -Prune \) -type f \
  -exec sed -i 's/[:space:]+$//' \{} \;  \
  -exec sed -i 's/\r\n$/\n/' \{} \;

Es wird den .git-Ordner nicht berühren, wenn es einen gibt.

Bearbeiten: Es wurde nach dem Kommentar etwas sicherer gemacht, sodass keine Dateien mit ".git" oder ".svn" aufgenommen werden können. Aber Vorsicht, es wird Binärdateien berühren, wenn Sie welche haben. Verwenden -iname "*.py" -or -iname "*.php" nach -type f wenn Sie nur möchten, dass es z. .py und .php-Dateien.

pdate 2: Ersetzt jetzt alle Arten von Leerzeichen am Zeilenende (was auch Tabulatoren bedeutet)

5

Rubin:

irb
Dir['lib/**/*.rb'].each{|f| x = File.read(f); File.write(f, x.gsub(/[ \t]+$/,"")) }
4
grosser

Dies funktioniert gut. Add/remove --include für bestimmte Dateitypen:

egrep -rl ' $' --include *.c *  | xargs sed -i 's/\s\+$//g'
4
Grant Murphy

1) Viele andere Antworten verwenden -E. Ich bin mir nicht sicher warum, da das ndokumentierte BSD-Kompatibilität Option ist. Stattdessen sollte -r Verwendet werden.

2) Andere Antworten verwenden -i ''. Das sollte nur -i Sein (oder -i'', Falls bevorzugt), da -i Gleich danach das Suffix hat.

3) Git spezifische Lösung:

git config --global alias.check-whitespace \
'git diff-tree --check $(git hash-object -t tree /dev/null) HEAD'

git check-whitespace | grep trailing | cut -d: -f1 | uniq -u -z | xargs -0 sed --in-place -e 's/[ \t]+$//'

Der erste registriert einen Git-Alias ​​check-whitespace, Der die Dateien mit nachgestellten Leerzeichen auflistet. Der zweite führt sed auf ihnen aus.

Ich verwende nur \t Anstatt [:space:], Da ich normalerweise keine vertikalen Tabulatoren, Formular-Feeds und nicht zerbrechlichen Leerzeichen sehe. Ihre Messung kann variieren.

2
Ondra Žižka

Das funktioniert bei mir (Mac OS X 10.8, GNU sed von Homebrew installiert):

find . -path ./vendor -Prune -o \
  \( -name '*.Java' -o -name '*.xml' -o -name '*.css' \) \
  -exec gsed -i -E 's/\t/    /' \{} \; \
  -exec gsed -i -E 's/[[:space:]]*$//' \{} \; \
  -exec gsed -i -E 's/\r\n/\n/' \{} \;

Entfernte nachgestellte Leerzeichen, ersetzt Tabulatoren durch Leerzeichen, ersetzt Windows CRLF durch Unix \n.

Interessant ist, dass ich das 3-4 Mal ausführen muss, bevor alle Dateien repariert werden, durch alle Anweisungen zum Reinigen von gsed.

1
yegor256

Ich benutze reguläre Ausdrücke. 4 Schritte:

  1. Öffnen Sie den Stammordner in Ihrem Editor (ich verwende Visual Studio-Code).
  2. Tippen Sie links auf das Suchsymbol und aktivieren Sie den regulären Ausdrucksmodus.
  3. Geben Sie "+\n" in die Suchleiste und "\ n" in die Ersetzungsleiste ein.
  4. Klicken Sie auf "Alle ersetzen".

Dadurch werden alle nachgestellten Leerzeichen am Ende jeder Zeile in allen Dateien entfernt. Und Sie können einige Dateien ausschließen, die dieser Anforderung nicht entsprechen.

1
roedeercuco