2016-05-26 11 views
0

In einem Verzeichnis habe ich etwa 50 Dateien und Ordnern, die einige Ordner mit Platz in ihren Namen enthält. Ich möchte einige Ordner mit ls, grep und xargs löschen, aber nicht die Ordner mit Leerzeichen in ihren Namen löschen und zeigt Ausnahme an. Kann jemand helfen? Verwenden eines Solaris-Betriebssystems. Ich versuchte unten alles zu löschen, außer $ Dateienrm Befehl mit xargs verwendet werden, um einige Ordner mit Platz im Namen auszuschließen

ls | grep -v "$ files" | xargs rm

und wenn ich unten Befehl versuchte es löscht alles einschließlich $ Dateien, die ich nicht will.

ls | grep -v "$ files" | xargs rm - * \ *

Antwort

0

Ohne Nicht-Standard-Erweiterungen zu verwenden und die Shell unter der Annahme implementiert while read ..., sollte dies auch funktionieren:

ls | grep -v "$files" | while read filename; do 
    rm "$filename" 
done 

Die Anführungszeichen um $filename kritisch sind. Ohne die Anführungszeichen wird das Argument auf alle Leerzeichen im Namen aufgeteilt.

Beachten Sie auch, dass ein Verzeichnis nicht gelöscht wird - wie andere bereits erwähnt haben, benötigen Sie dazu rm -r - oder rmdir -. Aber rm -r löscht ein Verzeichnis und alles darin. rmdir wird standardmäßig ein nicht leeres Verzeichnis nicht löschen.

Sie wahrscheinlich einen Test zuerst mit so etwas wie

ls | grep -v "$files" | while read filename; do 
    ls -ld "$filename" 
done 

Verwenden Sie die -ld Optionen ls sicher sein, laufen sollte sind Sie die richtige Datei bekommen, und auch nicht Liste Verzeichnisinhalt, wenn die Datei Der übergebene Name ist zufällig ein Verzeichnis.

0

Unix-ähnliche Systeme erlauben die Darstellung beliebiger Zeichen in Dateinamen mit Ausnahme des ASCII NUL-Zeichens und des Schrägstrichs. Schrägstriche können in Pfadnamen auftreten (als Verzeichnistrennzeichen), aber nicht in den Namen tatsächlicher Verzeichniseinträge. Dies bedeutet, dass die Liste der Dateien, die xargs liest, Leerzeichen enthalten könnte - Leerzeichen, Tabulatoren und Zeilenumbrüche. Da xargs standardmäßig davon ausgeht, dass die Liste der zu lesenden Dateien Leerraum als Argumenttrennzeichen verwendet, kann der Fall, in dem ein Dateiname tatsächlich Leerraum enthält, nicht korrekt verarbeitet werden. Dies macht das Standardverhalten von xargs fast nutzlos für die Verarbeitung beliebiger Daten.

Um dieses Problem zu lösen, führte GNU findutils die Aktion '-print0' zum Suchen ein. Dies verwendet das Zeichen ASCII NUL, um die Einträge in der Dateiliste zu trennen, die es erzeugt. Dies ist die ideale Wahl für Trennzeichen, da es das einzige Zeichen ist, das nicht innerhalb eines Pfadnamens erscheinen kann. Die '0' -Option zu xargs lässt annehmen, dass Argumente mit ASCII NUL anstelle von Leerraum getrennt sind. Es deaktiviert auch ein anderes Fehlmerkmal in dem Standardverhalten von xargs, das ist, dass es auf Anführungszeichen in seiner Eingabe achtet. Einige Versionen von xargs enden auch, wenn sie ein einzelnes '_' in der Eingabe sehen, aber GNU findet das nicht mehr (da es ein optionales Verhalten im Unix-Standard geworden ist).

So setzen, -print0 zusammen mit xargs finden -0 bekommen wir diesen Befehl ein:

find /var/tmp/stuff -mtime +90 -print0 | xargs -0 /bin/rm 

Das Ergebnis ist eine effiziente Vorgehensweise, die korrekt die alle möglichen Zeichen behandelt, die in der Liste der Dateien angezeigt werden könnten löschen. Das sind gute Neuigkeiten. Allerdings gibt es, wie Sie sicherlich erwarten, auch schlechtere Nachrichten. Das Problem ist, dass dies kein tragbares Konstrukt ist; obwohl andere Versionen von Unix (insbesondere BSD-abgeleitete) "-print0" unterstützen, ist es nicht universell.

+0

'find ... -print0' und' xargs -0' sind Nicht-Standard-GNU-Erweiterungen. Sie erwähnen GNU-Dienstprogramme, machen aber nicht klar, dass Nicht-GNU-Implementierungen wahrscheinlich nicht über diese Erweiterungen verfügen. –

0

Sie können Ordner nicht mit dem Befehl rm entfernen, wenn Sie nicht die Option -r (rekursiv) verwenden. Ich gehe davon aus, dass Sie einzelne Dateien, nicht ganze Verzeichnisse löschen wollen.

In jedem Fall können Sie Dateien und Verzeichnisse mit arbitray-Namen mit den Standardbefehlen find bearbeiten, die bei Solaris immer verfügbar sind. Weder xargs noch GNU-spezifische Erweiterungen sind notwendig.

Hier ist ein Beispiel. Alle Dateien mit Ausnahme der mit dem .jpg oder .JAVA Suffix, und solche mit keepme in ihre Namen werden beibehalten, werden alle verbleibenden Dateien verarbeitet werden:

find . -type f ! -name "*.jpg" ! -name "*keepme*" ! -name "*.java" -exec echo rm {} + 

den echo Befehl entfernen, wenn Sie die Datei Entfernen wollen tatsächlich durchgeführt werden.

Verwandte Themen