Comment puis-je faire pour exclure le dossier dans lequel il recherche?


18

J'exécute la commande suivante:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

Je voudrais supprimer tous les dossiers sous le processingdossier (le dossier de traitement ne doit jamais être supprimé).

La commande supprime également le processingdossier. Comment limiter le script pour supprimer uniquement les dossiers sous ce dossier?


Réponses:


32

La façon la plus simple serait de simplement ajouter -mindepth 1, ce qui sautera la première hiérarchie de profondeur et supprimera ainsi votre répertoire parent.

De plus, vous n'avez pas besoin d'un -execappel supplémentaire à rm, vous pouvez simplement deletedirectement les dossiers s'ils sont vides.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

S'ils ne sont pas vides:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Si vous êtes paresseux, vous pouvez également développer un caractère générique. Étant donné que *n'inclut pas le répertoire actuel par défaut ( sauf s'il dotglobest défini ), vous pouvez également faire:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

Cependant, cela n'inclurait pas non plus les dossiers cachés, encore une fois en raison de l' dotgloboption.


Bonjour, j'obtiens "find: avertissement: vous avez spécifié l'option -mindepth après un argument non-option -type, mais les options ne sont pas positionnelles (-mindepth affecte les tests spécifiés avant lui ainsi que ceux spécifiés après). Veuillez spécifier les options avant les autres arguments. "et aussi" find: impossible de supprimer `/ dossier / 50d82faf0e09e ': répertoire non vide"
Elad Dotan

Ajoutez ensuite l'esprit avant de taper. Pour supprimer les répertoires lorsqu'ils ne sont pas vides, vous pouvez vous en tenir à l'approche rm que vous aviez à l'origine.
slhck

4

Le problème est que find renvoie le répertoire courant (.) Avec les autres répertoires, il supprime donc le dossier de traitement ainsi que les sous-répertoires. Un moyen rapide de contourner ce problème serait d’ajouter l’option

-not -name .

ce qui empêche la recherche de sortir le répertoire courant, et à son tour l'empêche d'être supprimé.

Cela fonctionnerait si vous exécutiez la commande dans le répertoire de traitement, afin de tenir compte du fait que vous utilisez un chemin absolu:

-not -name /var/www/html/content/processing

Et toute la commande serait:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;

La dernière commande est erronée. -namefait référence au nom de base, il ne correspond jamais à une barre oblique. Vous devez probablement utiliser -path.
Kamil Maciorowski

1

Déjà répondu, je voudrais encore énumérer une autre approche.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Cela exclura le répertoire supérieur (et également les sous-répertoires), et maintenant vous pouvez appliquer la commande que nous voulons appliquer dessus.

>> Options:
-mindepth 1: pour exclure le répertoire racine
-maxdepth 1: pour éviter d'analyser les sous-répertoires. (Pour un scénario particulier tel que questionné, vous n'en avez pas besoin).
-type d: répertorie uniquement les types de répertoire. Cette option devrait venir après les utilisations de mindepth maxdepth.


Pourquoi -maxdepth 1? Pourquoi -type ddeux fois? En quoi est-ce différent de la réponse acceptée?
Attie

@Attie: Merci, corrigé l'erreur. maxdepth n'est pas nécessaire, mais il serait utile si vous voulez éviter de lister les sous-répertoires.
prashant
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.