Linux Dateien löschen

Gast #4439249
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
Gast
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
Gast
Da stimmt aber was nicht...
1
[/mnt/usb/Daten] # find /mnt/usb/Daten -iname "*.nfo" -delete
2
BusyBox v1.01 (2014.05.19-18:05+0000) multi-call binary
3

4
Usage: find [PATH...] [EXPRESSION]
5

6
Search for files in a directory hierarchy.  The default PATH is
7
the current directory; default EXPRESSION is '-print'
8

9
EXPRESSION may consist of:
10
        -follow         Dereference symbolic links.
11
        -name PATTERN   File name (leading directories removed) matches PATTERN.
12
        -print          Print (default and assumed).
13

14
        -type X         Filetype matches X (where X is one of: f,d,l,b,c,...)
15
        -perm PERMS     Permissions match any of (+NNN); all of (-NNN);
16
                        or exactly (NNN)
17
        -mtime TIME     Modified time is greater than (+N); less than (-N);
18
                        or exactly (N) days
19

20
[/mnt/usb/Daten] #
Gast
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
Gast
1
find -iname "*.nfo" -not -path '*/\.*' -delete
2
find -iname "*.nfo" -not -path '*/\.*' -exec rm {} \;
lässt jeweils die Hilfe anzeigen - gelöscht wird nichts
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:
1
find <verzeichnis> -type f | grep '/.daten.nfo$' | awk '{print "rm [-f]", $1}'

4. Kontrollieren, ob es dass ist was Du willst!

5. Löschkommandos mit der bash ausführen:
1
find <verzeichnis> -type f | grep '/.daten.nfo$' | awk '{print "rm [-f]", $1}' | bash

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.
Gast
>>> 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.
Gast
Hier nochmal zur Übersicht...(Ist ein Beispiel)

1
root@vusolose:~# find /mnt/hdd/Daten/ -iname "*.nfo"
2
/mnt/hdd/Daten/Ordner3/.test.nfo
3
/mnt/hdd/Daten/Ordner3/test.nfo
4
/mnt/hdd/Daten/Ordner2/.test.nfo
5
/mnt/hdd/Daten/Ordner2/test.nfo
6
/mnt/hdd/Daten/Ordner1/.test.nfo
7
/mnt/hdd/Daten/Ordner1/test.nfo
8
root@vusolose:~#


Die sichtbaren Dateien sollen weg und die mit dem Punkt vorne(also 
versteckte) sollen bleiben
Gast
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
1
ls /mnt/hdd/Daten/*/*.nfo
dann siehst du, was erwischt wird.
Gast
hm irgentwas ist ebend bei edit verschwunden

find /home/theborg -iname "*.nfo" -exec find {} \; -not \( -iname ".*" 
\)

war es aber ok leuft wohl nicht
Gast
Auch mal Senf dazu abgeben...
1
# finde alle .*.nfo Dateien
2
find /mnt/hdd/Daten/ -iname '.*.nfo'
3
# finde alle *.nfo, die NICHT mit . beginnen
4
find /mnt/hdd/Daten/ -iname '[^.]*.nfo'

Den Rest kann man sich einfach mit
1
rm $(find ....)
(auch auf einer kastrierten Busybox) zusammenbauen.
Wichtig hierbei: mit ' quoten, damit die Shell nicht dazwischen funkt...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.