21 Stimmen

Sed erstellt nicht löschbare Dateien in Windows

Ich versuche, den folgenden Befehl in Windows Server 2003 auszuführen, aber sed erzeugt einen Stapel von Dateien, die ich nicht von der Befehlszeile aus im aktuellen Verzeichnis löschen kann.

for /R %f in (*.*) do "C:\Program Files\gnuwin32\bin\sed.exe" -i "s/bad/good/g" "%f"

Hat jemand irgendwelche Vorschläge? Seltsamerweise kann ich die Dateien mit dem Windows Explorer löschen.

Wie gewünscht, finden Sie hier einige Beispieldateinamen:

  • sed0E3WZJ
  • sed5miXwt
  • sed6fzFKh

Und weitere Informationen zur Fehlerbehebung...

  • Er tritt sowohl in der Eingabeaufforderung als auch in Batch-Dateien auf
  • Wenn ich sed nur in einem einzigen Verzeichnis ausführen muss, verwende ich sed "s/bad/good/g" *.* und alles ist in Ordnung. Leider muss ich auch alle Unterverzeichnisse mit einbeziehen.
  • Ich habe nur Sed installiert.
  • Sed erstellt die Dateien

27voto

NP Compete Punkte 2369

Ich habe Ihre Einrichtung nachgebildet und habe folgende Beobachtungen gemacht.

  1. Ich glaube nicht, dass es ein Problem mit der Schleife gibt. Der einfache Befehl " C:\Program Dateien \gnuwin32\bin\sed.exe " -i "s/bad/good/g" . - erstellt dieselbe Menge an temporären Dateien.
  2. Die Dateien werden tatsächlich von sed erstellt. sed erstellt diese temporären Dateien, wenn die Option "in place" (-i) aktiviert ist. Normalerweise löscht sed die Dateien (so geschieht es in cygwin) durch einen Aufruf der Bibliothek "unlink". Im Falle von gnuwin32 sieht es so aus, als ob das "unlink" fehlschlägt. Ich habe nicht herausfinden können, warum. Ich habe vermutet, dass der unlink-Aufruf vielleicht von der gnuwin32-'coreutils'-Bibliothek abhängt, und habe versucht, die coreutils-Bibliothek herunterzuladen und zu installieren - vergeblich.
  3. Wenn Sie vor dem Ausführen des sed-Befehls die Einschränkung "schreibgeschützt" im übergeordneten Ordner aufheben, können Sie die temporären Dateien über die Windows-Eingabeaufforderung löschen. Das sollte Ihnen also vorübergehend etwas Ruhe verschaffen.

Ich denke, wir haben jetzt genug Informationen, um einen Fehlerbericht zu erstellen. Wenn Sie damit einverstanden sind, halte ich es für eine gute Idee, die guten Leute, die für gnuwin32 verantwortlich sind, darauf aufmerksam zu machen und sie um Hilfe zu bitten.

In der Zwischenzeit bereinigt die folgende Version ihre temporäre Datei:

3voto

darrenmc Punkte 1661

Da dies ein bekannter Fehler in sed mit der Option -i ist, können Sie Folgendes ausführen attrib -R <filename> um das Nur-Lese-Attribut aus der Datei zu entfernen, nachdem sed beendet wurde.

Alternativ können Sie auch die Option -i nicht verwenden und die Ausgabe in eine neue Datei umleiten und dann die Ein- und Ausgabe löschen und umbenennen.

1voto

Ana Betts Punkte 72423

Cygwin versaut manchmal die ACLs von Dateien. Sie müssen wahrscheinlich cacls oder chmod verwenden, um das zu korrigieren, bevor Sie die Datei löschen können.

1voto

Hier kommt ein wenig Fehlersuche ins Spiel. Passiert das, wenn Sie diesen Befehl über die Befehlszeile ausführen? y eine Batch-Datei? Was passiert, wenn Sie sed für eine einzelne Datei auf der Kommandozeile ausführen - werden diese Dateien für jede Datei oder nur für bestimmte Dateien/Dateitypen erstellt? Passiert das nur bei dieser Ersetzung oder bei allen Ersetzungen im Allgemeinen oder immer, wenn Sie sed.exe auf eine Datei anwenden? Erzeugt nur sed diese Dateien oder alle Gnuwin32-Exe-Dateien (z.B. awk, cat, etc.)? Passiert dasselbe bei einer sed.exe von einer Neuinstallation von Gnuwin32? Welche Fehlermeldung wird ausgegeben, wenn Sie versuchen, die Dateien zu löschen? Können Sie die Dateien aus dem Explorer löschen, während die Eingabeaufforderung noch geöffnet ist? Was passiert, wenn Sie die Eingabeaufforderung schließen und erneut öffnen und dann versuchen, die Dateien zu löschen?

0voto

ghostdog74 Punkte 305138

Sie können sed einfach ohne for-Schleife ausführen

c:\test> sed -i.bak "s/bad/good/g" file*.*

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X