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
Schau mal da nach, da gibt es viele nützliche Einzeiler: http://www.commandlinefu.com Stichwort für dein Problem sind find, xargs und rm...
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
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] # |
Sepp schrieb: > Da stimmt aber was nicht... da ist eine abgespeckte Version von find, die kann das nicht.
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
Sepp schrieb: > Was muss ich dann eingeben, das er nur die sichtbaren .nfo Dateien > löscht? man find
:
Bearbeitet durch User
Habe hier schon gesucht - aber nix gefunden... http://www.linux-praxis.de/lpic1/manpages/find.html
1 | -sh: man: not found |
wenn ich das hier anwende:
1 | find -iname "*.nfo" -delete |
sind die versteckten Dateien mit weg...
Aktuelle VTI- Version...
1 | find ./ -name "*.nfo" -exec rm -f {} \; -print |
löscht die versteckte .Datei.nfo mit
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" ...
Das hier lässt alle versteckten Dateien am leben:
1 | find -iname "*.nfo" -not -path '*/\.*' -delete |
-not -path '*/\.*' hinzufügen um die versteckten Dateien überleben zu lassen.
Tom T. schrieb: > Das hier lässt alle versteckten Dateien am leben: Das "find" der Busybox hat vorigem Link zufolge auch kein "-not".
Tom T. schrieb: > Das hier lässt alle versteckten Dateien am leben: > >
1 | find -iname "*.nfo" -not -path '*/\.*' -delete |
Oder falls -delete nicht geht tut auch
1 | find -iname "*.nfo" -not -path '*/\.*' -exec rm {} \; |
A. K. schrieb:
> Das "find" der Busybox hat vorigem Link zufolge auch kein "-not".
Ach mist, hätte ich mal RTFM. Danke..
Davon war auch nicht die Rede, diese nicht zu löschen. Die Rede war von allen *.nfo Dateien. Grüsse, René
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.
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
sorry - hatte ich oben verwechselt SO MÖCHTE ICH ES HABEN: die unsichtbaren .daten.info sollen bleiben nur die daten.nfo sollen weg
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.
bei
1 | find /mnt/usb/Daten/*.nfo -delete |
findet er keine Daten und bei:
1 | find /mnt/usb/Daten/ *.nfo -delete |
ist alles weg - auch der Ordner Daten
Heißt die Datei die weg soll immer Daten.nfo? Wenn ja: find /mnt/usb/Daten -name 'daten.nfo' -delete
>>> 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.
JJ schrieb: > Heißt die Datei die weg soll immer Daten.nfo? > > Wenn ja: > find /mnt/usb/Daten -name 'daten.nfo' -delete Nein
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
installier dir halt die gnu-findutils. dann hastn etwas (viel) mächtigeres find
Die Ordner heissen alle anders. Das Ordner habe ich nur als Beispiel genommen. Es müssen also alle Ordner im Ordner Daten durchsucht werden.
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.
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 :-)
K. J. schrieb: > Würde auch gehen ja, wenn das find den Parameter exec kennen würde - das ist eine busybox Version die das aber nicht kann.
hm irgentwas ist ebend bei edit verschwunden find /home/theborg -iname "*.nfo" -exec find {} \; -not \( -iname ".*" \) war es aber ok leuft wohl nicht
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...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.