Hallo,
ich habe auf meinem Server verschiedene Ordner und dort sind bestimmte
Dateien drin. Nun würde ich gerne aus allen Ordner nur die nfo-Dateien
entfernen lassen.
Beispiel
/mnt/usb/Daten/Ordner1
/mnt/usb/Daten/Ordner2
/mnt/usb/Daten/Ordner3
/mnt/usb/Daten/Ordner4
Und in jedem OrdnerX ist eine Datei mit der Endung nfo drin.
Die anderen Dateien in dem Ordner sollen nicht gelöscht werden.
Auch sollen die OrdnerX alle da bleiben.
Wie kann ich das mit rm machen, damit er mir nur die nfo-Dateien
löscht
Quasi:
rm /mnt/usb/Daten *.nfo
find /mnt/usb/Daten -iname "*.nfo" -delete
macht alles weg.
Wenn zwischen Groß- und Kleinschreibung unterschieden werden soll,
dann -name statt -iname verwenden.
Gruß
Hans
auf einem anderen Rechner geht es...
Jetzt noch eine Frage?
Wenn in dem Ordner versteckte Dateien sind (Beispiel .daten.nfo)
Was muss ich dann eingeben, das er nur die sichtbaren .nfo Dateien
löscht?
.daten.nfo weg
daten.nfo sollen bleiben
Guckst du eben hier: https://busybox.net/downloads/BusyBox.html
Allerdings in Busybox nicht nur die Funktion kastriert, sondern auch die
Doku, weshalb die nur Leuten hilft, die das Original kennen. Versuchs
mit
find ... -name ".*.ndo" ...
Sepp schrieb:> Was muss ich dann eingeben, das er nur die sichtbaren .nfo Dateien> löscht?>> .daten.nfo weg> daten.nfo sollen bleiben
Also was jetzt`? Die mit "." vorne sind in Linux üblicherweise die
unsichtbaren. Sollen nun die weg oder die sichtbaren.
Mein Lösungsansatz:
1. Mit find alle Dateien im Baum listen.
1
find <verzeichnis> -type f
2. Mit grep die heraus filtern, mit denen Du etwas machen möchtest,
zum Beispiel:
1
find <verzeichnis> -type f | grep '/.daten.nfo$'
Falls das Suchmuster nicht das gewünschte Ergebnis liefert: man regex
ist Dein Freund. Man kann auch mehrere grep, sed etc. hintereinander
pipen.
3. Mit awk (es gehen auch andere Utilities, man kann aber auch mit
awk filtern) aus den so gewonnenen Pfaden die Löschkommandos
generieren:
Es gibt andere Wege aber dieser ist der wahrscheinlich universellste,
quasi der RISC-Ansatz. Er kommt mit einer Hand voll Kommandos und mit
einer Hand voll Optionen aus und lässt sich beliebig ausbauen. So kann
man zum Beispiel Kommandos erzeugen, mit der Output dann wieder
Kommandos erzeugt werden und so weiter, begrenzt eigentlich nur durch
die Länge der Kommandozeile. (Dann muss man die Zwischenergebnisse halt
in Dateien zwischenspeichern.) Ein großer Vorteil ist auch, dass Du
siehst, was für Kommandos erzeugt werden, bevor Du sie ausführst.
>>> viel geschwurbel um find <<<
Eigentlich beherrschen die Guten[TM] Shells (sh, ksh, bash) das sog.
Globbing.
Da es offensichtlich hier um BusyBox geht, weiss ich halt nicht ob mein
folgender Tip da dann auch wirkt.
Also, die Punkdateien mit "Endung"[1] .info behalten, die anderen mit
dieser Endung löschen:
> Beispiel> /mnt/usb/Daten/Ordner1> /mnt/usb/Daten/Ordner2> /mnt/usb/Daten/Ordner3> /mnt/usb/Daten/Ordner4> Und in jedem OrdnerX ist eine Datei mit der Endung nfo drin.
(ls erstmal zur Kontrolle,
rm zum wirklich löschen)
1
ls -1d /mnt/usb/Daten/Ordner[1234]/[^.]*.info
2
rm -v /mnt/usb/Daten/Ordner[1234]/[^.]*.info
Einfacher, aber nicht so eng gefasst:
1
ls -1d /mnt/usb/Daten/Ordner?/[^.]*info
2
rm -v /mnt/usb/Daten/Ordner?/[^.]*info
noch breiter gefasst, für risikofreudige Schreibfaule:
1
ls -1d /mnt/u*/D*/O*/[^.]*info
2
rm -v /mnt/u*/D*/O*/[^.]*info
Erklärung
Anders als bei DOS, können Richtige[TM] Shells mehrere "Wildcards",
genauer Globbings pro Pfad korrekt auflösen (inwieweit dies bei
BusyBox auch gilt, hängt von der Version v. BusyBox und deren
tatsächlich einkompilierten Optionen ab).
Da gelten also:
- "?" Platzhalter für EIN Zeichen
- "*" Platzhalter für 0, 1 oder mehrere Zeichen
- "[ghRS]" Zeichengruppe, Platzhalter für EINES der Zeichen "g", "h",
"R" oder "S"
- "[^Fu]" negierte Zeichengruppe, Platzhalter für EIN Zeichen welches
NICHT "F" und nicht "u" ist.
[1] was ist eine Dateiendung? *nix Dateisysteme kennen nur DATEINAMEN
(keine Endungen, engl. Extensions). Dateinamen ist eine Zeichenkette
(engl. String) in der kaum ein Zeichen veboten ist. So auch nicht der
Punkt ".", er darf sooft man will oder auch gar nicht im Dateinamen
vorkommen.
Klar hat man Handhabungsprobleme mit einer Datei welche z.B. "^J^G^H^M
}:-)" heisst, das Dateisystem kann sie aber aufnehmen und wiedergeben.
Konrad S. schrieb:> /mnt/hdd/Daten/*/*.nfo
Wie funktioniert hier die Unterscheidung zwischen versteckten und nicht
versteckten Files? Also den führenden Punkt meine ich...
Wenn ich das richtig sehe, werden hier ALLE Files, die auf '.nfo' enden,
gefunden, also auch die versteckten. Oder?
?!? schrieb:> Wie funktioniert hier die Unterscheidung zwischen versteckten und nicht> versteckten Files? Also den führenden Punkt meine ich...
Bei Unix ist es üblich, dass bei der Dateinamensexpansion der Shells der
Stern als Wildcard den Punkt in Erstposition eines Dateinamens nicht
abdeckt.
Probier einfach mal
Konrad S. schrieb:> Bei Unix ist es üblich, dass bei der Dateinamensexpansion der Shells der> Stern als Wildcard den Punkt in Erstposition eines Dateinamens nicht> abdeckt.
Das hab ich nicht gewusst. Danke für die Auskunft :-)