Linux Dateien löschen

Gast #4439249
Lesenswert?

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 #4439269
Lesenswert?

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 #4439295
Lesenswert?

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
#4439440
Lesenswert?

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 #4439454
Lesenswert?

>>> 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 #4439491
Lesenswert?

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
#4439629
Lesenswert?

?!? 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 #4439833
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren