Wie entferne ich nur den Inhalt von Verzeichnissen?

14

Ich bin in einem Ordner: /var/myfolder.

Im Inneren befinden sich einige andere Ordner wie: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/etc.

In jedem befinden sich einige Dateien mit zufälligen Namen. Wie entferne ich alle Dateien aus allen darin enthaltenen Ordnern /var/myfolder?

Die Struktur (alle darin enthaltenen Verzeichnisse, z. B. A, B, C usw. /var/myfolder) sollte intakt bleiben.

IroeN
quelle

Antworten:

17

Versuchen:

find /var/myfolder -type f -delete

Dadurch werden alle regulären Dateien unter / var / myfolder abgerufen und gelöscht, wobei nur die Verzeichnisse übrig bleiben.

StarNamer
quelle
Danke für die Lösung. Ich hätte erwähnen sollen, dass ich dies in Solaris 9 mache, sodass mein Fund die Option -delete nicht hat, aber das ist ein guter Ausgangspunkt.
IroeN
2
Ich konnte folgende Lösung finden: find / var / myfolder -type f -exec rm -f {} \;
IroeN
2
Es tut uns leid. Ich benutze Debian oder Ubuntu. Ihre Lösung ist meines Wissens gleichwertig.
StarNamer
6
-type f! =! -type d
mikeserv
7

Verwenden Sie in zsh das . Glob-Qualifikationsmerkmal , um nur reguläre Dateien zu finden:

rm -- **/*(.)

Dadurch werden alle (nicht ausgeblendeten) regulären Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen rekursiv gelöscht. Fügen Sie das DGlob-Qualifikationsmerkmal hinzu, um auch ausgeblendete reguläre Dateien (und reguläre Dateien in ausgeblendeten Verzeichnissen) zu löschen.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich benutze Bash.
IroeN
1
@ user6554: ... was weder deine Frage noch die verwendeten Tags anzeigen;)
0xC0000022L
3

Sie können laufen rm */*in/var/myfolder

Dinesh
quelle
3
find . -depth -exec rm {} + 2>/dev/null

rm entfernt keine Verzeichnisse - führen Sie es einfach auf allen aus.

So behalten Sie Symlinks zu Verzeichnissen bei:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

Und ich denke, dies sollte vielleicht auch ein wenig optimiert funktionieren, wenn es viele Dateien gibt, die in der obigen Version getestet werden müssen:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +
mikeserv
quelle
Beachten Sie, dass GNU findeine -xtypeOption dafür hat.
Stéphane Chazelas
@ StéphaneChazelas - Ast auch. aber ich brauchte keine tiefe, glaube ich nicht. Ich habe es in der obersten gehalten, um so viele Fehleraufrufe zu vermeiden - stummgeschaltet oder nicht -, aber in den anderen war es einfach albern.
mikeserv
1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print
Nerz
quelle
0
rm var/myfolder/*/*

Dadurch wird alles in den Unterordnern gelöscht, ohne die Unterordner selbst zu berühren.

Die erste *ist für die Unterverzeichnisse von myfolderselbst ( A, B, ...). Die zweite *ist für die Dateien in A, Busw.

WENN es im Inneren mehrere Ordner sind A, Busw. Erster Lauf: rm /var/myfolder/*/*/*dann laufen rm /var/myfolder/*/*.

Edgar Naser
quelle
0

Sie sollten auch in der Lage sein, eine CD an den Anfang des betreffenden Verzeichnisbaums zu schreiben und dann Folgendes auszuführen:

find . -type f -print0 | xargs -0 rm -rf

und das sollte alle Dateien löschen, während der Verzeichnisbaum intakt bleibt. Die Optionen -print0 und -0 können weggelassen werden, wenn Sie sicher sind, dass Sie keine Datei- oder Verzeichnisnamen haben, die Leerzeichen enthalten.

Der Befehl find unterscheidet zwischen Dateien (-type f) und Verknüpfungen (-type l), sodass Verknüpfungen intakt bleiben sollten, falls vorhanden. Nicht getestet. Führen Sie im Zweifelsfall Folgendes aus:

finden . -Typ l

und prüfen Sie, ob etwas angezeigt wird, bevor Sie den früheren Befehl find ausführen.

rjh427
quelle
Können Sie erklären, wie die rmFlagge dazu -r, -R, --recursive - remove directories and their contents recursivelypasst?
Stephen Rauch
Da wir nicht rm -rf ausführen, wird find ausgeführt. -type f und leite dann die Ausgabe von diesem zu rm -rf. Es werden also nur Dateien entfernt und die Verzeichnisse nicht berührt. Das ist was die | Wenn das xargs-Bit dies tut, nimmt es die Ausgabe des Befehls auf der linken Seite und sendet sie an den Befehl auf der rechten Seite.
rjh427
Genau mein Punkt. Was nützt ein Flag, das nur für Verzeichnisse funktioniert, wenn Sie keine Verzeichnisse übergeben?
Stephen Rauch
Weil das Muskelgedächtnis und es immer noch funktioniert. Sie könnten den gleichen Einwand gegen die Option -f "force" erheben, ich würde Ihnen die gleiche Antwort geben.
rjh427
-2

Verwenden Sie einfach den folgenden Befehl:

sudo rm -rf directory_in_which_you_have_content / *

---------------- ODER --------------------------------- -----------------------

Das '*' steht für alles, wenn Sie * verwenden, um den gesamten Inhalt zu löschen. Verwenden Sie also entweder den folgenden Befehl oder gehen Sie in das Verzeichnis, in dem Sie den gesamten Inhalt löschen möchten, und verwenden Sie einfach den folgenden Befehl:

sudo rm -rf *

keyur bhatt
quelle