Rm-Befehl mit Ausnahmen anwenden

Hallo an alle!

Ich habe ein Verzeichnis namens „test“ in dem viele Dateien unterschiedlichen Typs liegen. Nun will ich gerne in einem Rutsch alle Dateien löschen mit Ausnahmen der Dateien „.htaccess“ und „index.php“.

Wie baue ich dazu den rm-Befehl auf.
Um alles zu löschen:
rm test/*.*

Wie aber definiere ich diese Ausnahmen?

Danke + Gruß PHANTOM

Hallo PHANTOM

Ich habe ein Verzeichnis namens „test“ in dem viele Dateien
unterschiedlichen Typs liegen. Nun will ich gerne in einem
Rutsch alle Dateien löschen mit Ausnahmen der Dateien
„.htaccess“ und „index.php“.

Wie baue ich dazu den rm-Befehl auf.

Wie aber definiere ich diese Ausnahmen?

Gar nicht. Zumindest in diesem Fall, wo kein Muster zu sehen ist. Aber bei zwei Dateien würde ich das Naheliegende tun und diese zwei Dateien irgendwo anders erstmal „zwischenlagern“, d.h. kopiere bzw. verschiebe sie einfach in ein anderes Verzeichnis. Dann kannst Du beruhigt alles löschen.

Viele Grüße
Marvin

Hallo Marvin,

danke für deine Antwort.

Gar nicht. Zumindest in diesem Fall, wo kein Muster zu sehen
ist. Aber bei zwei Dateien würde ich das Naheliegende tun und
diese zwei Dateien irgendwo anders erstmal „zwischenlagern“,
d.h. kopiere bzw. verschiebe sie einfach in ein anderes
Verzeichnis. Dann kannst Du beruhigt alles löschen.

Klar, das wäre eine Idee, jedoch war das nur ein Beispielfall. Ich habe noch andere Verzeichnisse bei dem das gemacht werden muss mit viel mehr Ausnahme-Fällen.

Hmm, wenn es dafür keine Lösung gibt, dann muss ich eine Liste der Ausnahmen, wie du es sagst verschieben, alles Löschen und wieder zurückschieben.

Schade, ich dachte da gäbe es etwas…

Gruß PHANTOM

Hallo PHANTOM,

Klar, das wäre eine Idee, jedoch war das nur ein Beispielfall.
Ich habe noch andere Verzeichnisse bei dem das gemacht werden
muss mit viel mehr Ausnahme-Fällen.

Hmm, wenn es dafür keine Lösung gibt,

Das verändert natürlich die Sachlage. Es gibt immer eine Lösung, in der Regel heisst das, ein passendes Skript schreiben. Aber bei nur zwei Dateien hätte sich das natürlich nicht gelohnt. Aber so schon eher. Aber da kommt es einfach drauf an, wie die Ausnahmen beschaffen sind: immer die gleichen Dateien, die übrig bleiben sollen oder nicht, gibt es ein Muster, haben die zu löschenden Verzeichnisse wiederum Unterverzeichnisse usw. usw.

dann muss ich eine Liste
der Ausnahmen, wie du es sagst verschieben, alles Löschen und
wieder zurückschieben.

Du kannst diese Lösung natürlich als Grundlage nehmen. So als erster Ansatz würde mir einfallen, die zu rettenden Dateien in eine Textdatei schreiben, die dann vom Skript ausgelesen wird, so daß das Skript weiss, welche Dateien es hin- und herschieben soll.
Solch eine „Ausnahmedatei“ kannst du auch von einem Löschskript auslesen lassen, das dann eine Datei nur löscht, wenn sie nicht in dieser Datei drin steht. Das würde dann das hin- und herschieben ersparen. Das sind jetzt nur so erste Einfälle, die mehr als Anregung denn als Lösung dienen sollen.

Viele Grüße
Marvin

Hallo PHANTOM,

Klar, das wäre eine Idee, jedoch war das nur ein Beispielfall.
Ich habe noch andere Verzeichnisse bei dem das gemacht werden
muss mit viel mehr Ausnahme-Fällen.

Hmm, wenn es dafür keine Lösung gibt,

Das verändert natürlich die Sachlage. Es gibt immer eine
Lösung, in der Regel heisst das, ein passendes Skript
schreiben. Aber bei nur zwei Dateien hätte sich das natürlich
nicht gelohnt. Aber so schon eher. Aber da kommt es einfach
drauf an, wie die Ausnahmen beschaffen sind: immer die
gleichen Dateien, die übrig bleiben sollen oder nicht, gibt es
ein Muster, haben die zu löschenden Verzeichnisse wiederum
Unterverzeichnisse usw. usw.

Ja, immer die gleichenden Dateien sollen übrigbleiben. Die ganze Zeit habe ich meine kleine private Software von Version zu Version händig alles so erstellt, dass ich ein Release habe, das dauert mir aber einfach zu lange. Ich hänge so jede zwei Monate 3-4 Stunden dran das zu bauen.

dann muss ich eine Liste
der Ausnahmen, wie du es sagst verschieben, alles Löschen und
wieder zurückschieben.

Du kannst diese Lösung natürlich als Grundlage nehmen. So als
erster Ansatz würde mir einfallen, die zu rettenden Dateien in
eine Textdatei schreiben, die dann vom Skript ausgelesen wird,
so daß das Skript weiss, welche Dateien es hin- und
herschieben soll.
Solch eine „Ausnahmedatei“ kannst du auch von einem
Löschskript auslesen lassen, das dann eine Datei nur löscht,
wenn sie nicht in dieser Datei drin steht. Das würde dann das
hin- und herschieben ersparen. Das sind jetzt nur so erste
Einfälle, die mehr als Anregung denn als Lösung dienen sollen.

Das „Löschskript“ ist eine gute Idee. Werde mir eh gesammelte Shell-Kommandos in eine Datei schreiben und ausführen, dann erweitere ich dies um diese Funktion.

Danke für deine Hilfe, werde mich mal etwas umschauen wie das funktioniert.

Gruß PHANTOM

Versionsverwaltung?
Hallo PHANTOM,

Ja, immer die gleichenden Dateien sollen übrigbleiben. Die
ganze Zeit habe ich meine kleine private Software von Version
zu Version händig alles so erstellt, dass ich ein Release
habe, das dauert mir aber einfach zu lange.

Warum benutzt Du nicht einfach eine Versionsverwaltungs-Software, wie z.B. CVS
http://de.wikipedia.org/wiki/Concurrent_Versions_System
oder PRCS
http://prcs.sourceforge.net/
zur Verwaltung deiner Relase? Das erspart viel Arbeit. Gibt ja noch mehr und neuere, wie z.B. Subversion usw. Für jeden Bedarf was vorhanden und lohnt sich auch für kleinere Privatprojekte, sobald sie aus mehr als zwei Dateien bestehen.
Löst zwar dein jetziges Problem nicht, aber dafür künftige Probleme (wenn ich dirch richtig verstanden habe).

Viele Grüße
Marvin

Ja, ich benutze ein CVS-Repository, da wechsle ich immer zwischen den Versionen.
Kann ich mir dadurch Zeit sparen?

Gruß PHANTOM

Hallo PHANTOM

Ja, ich benutze ein CVS-Repository, da wechsle ich immer
zwischen den Versionen.
Kann ich mir dadurch Zeit sparen?

Ja prima, wusste ich nicht. Ich bin bei deinem Problem davon ausgegangen, daß Du händisch verschiedene Versionen in verschiedenen Verzeichnissen pflegst, also z.B. so was:

project\_xy
|
+--Version\_1.0
| |
| +--Version\_1.1
|
+---Version\_2.0
...

Da hättest Du garantiert Zeit und Nerven gespart, wenn diese ganze Verwaltung nicht von Hand sondern von einem Programm erledigt wird.
Da Du aber schon CVS benutzt, kann ich jetzt nichts dazu sagen. Da weiss ich zuwenig, was Du überhaupt machst und warum nun z.B. so eine aufwändige Löschaktion notwendig ist.
Es war mehr ein Hinweis, in der Hoffnung, was anzuregen, das Du noch nicht benutzt.

Viele Grüße
Marvin

Hallo Marvin,

ich benutze schon CVS um einzelne Versionen zu taggen, in verschiedenen Branches zu entwickeln. Auch erstelle ich mir hierüber bspw. Patches.
Leider habe ich ca. 400-500 Dateien, die zwar im Repository liegen, diese aber beim Ausliefern nicht dabei sind; das muss ein Kunde selbst dazukaufen. Und dieser Krams ist so verwoben, dass das einige Verzeichnisse betrifft.

Ich denke so ein Löschscript und das weitestgehend zu automatisieren, wäre schon eine enorme Zeitersparnis, deswegen danke ich dir für deine Anregung hierzu.

Gruß PHANTOM

Hi

Ich habe ein Verzeichnis namens „test“ in dem viele Dateien
unterschiedlichen Typs liegen. Nun will ich gerne in einem
Rutsch alle Dateien löschen mit Ausnahmen der Dateien
„.htaccess“ und „index.php“.

Wie baue ich dazu den rm-Befehl auf.
Um alles zu löschen:
rm test/*.*

rm kann sowas gar nicht, globbing wird immer von der shell gemacht.

Wie aber definiere ich diese Ausnahmen?

Leider schreibst Du nicht, welche shell Du verwendest und unter normalen Umstaenden wuerde ich DIch jetzt erstmal mit den Loesungen fuer zsh, tcsh, ksh, command.com usw. bewerfen. Du hast aber Glueck, ich hab keine Zeit und unterstelle daher, dass Du die Wald-und-Wiesen-bash verwendest.

In man bash duerften Dich die Abschnitte ueber die shell option extglob und die Umgebungsvariable GLOBIGNORE interessieren.

HTH,
Gruss vom Frank.

Hallo!

Danke für deine Antwort.

Wie aber definiere ich diese Ausnahmen?

Leider schreibst Du nicht, welche shell Du verwendest und
unter normalen Umstaenden wuerde ich DIch jetzt erstmal mit
den Loesungen fuer zsh, tcsh, ksh, command.com usw. bewerfen.
Du hast aber Glueck, ich hab keine Zeit und unterstelle daher,
dass Du die Wald-und-Wiesen-bash verwendest.

In man bash duerften Dich die Abschnitte ueber die shell
option extglob und die Umgebungsvariable GLOBIGNORE
interessieren.

Ich habe es mal so bei mir probiert:
GLOBIGNORE="*.php"
ls -al /Users/PHANTOM/test/*

Leider werden trotzdem alle *.php-Dateien aufgelistet.

Was mache ich denn da falsch?
Ich verwende:
„GNU bash, version 2.05b.0(1)-release-(powerpc-apple-darwin8.0)“

Gruß PHANTOM

Wie aber definiere ich diese Ausnahmen?

In man bash duerften Dich die Abschnitte ueber die shell
option extglob und die Umgebungsvariable GLOBIGNORE
interessieren.

Ich habe es mal so bei mir probiert:
GLOBIGNORE="*.php"
ls -al /Users/PHANTOM/test/*

Leider werden trotzdem alle *.php-Dateien aufgelistet.

Was mache ich denn da falsch?

Keine Ahnung, hier funktioniert das:

[frank@titan2 jail]$ find
.
[frank@titan2 jail]$ touch foo foo.bar foo.bak foo.swp
[frank@titan2 jail]$ echo *
foo foo.bak foo.bar foo.swp
[frank@titan2 jail]$ GLOBIGNORE=’*.bak’
[frank@titan2 jail]$ echo *
foo foo.bar foo.swp
[frank@titan2 jail]$ GLOBIGNORE=’*.ba?’
[frank@titan2 jail]$ echo *
foo foo.swp
[frank@titan2 jail]$ GLOBIGNORE=’*.bak:*.swp’
[frank@titan2 jail]$ echo *
foo foo.bar
[frank@titan2 jail]$ GLOBIGNORE=‚foo*‘
[frank@titan2 jail]$ echo *
*
[frank@titan2 jail]$ bash --version
GNU bash, version 3.00.15(1)-release (i386-redhat-linux-gnu)
Copyright © 2004 Free Software Foundation, Inc.
[frank@titan2 jail]$

Ich verwende:
„GNU bash, version
2.05b.0(1)-release-(powerpc-apple-darwin8.0)“

Naja, besonders aktuell ist die ja nicht gerade, und laeuft anscheinend auch noch auf einem seltsamen Betriebssystem. Ich kenne Leute, die muessen sich dafuer die trivialsten tools neu kompilieren, um sie in einer einigermassen funktionierenden Version zu haben.

Gruss vom Frank.