Supprimer les fichiers du répertoire sans erreur s'il est déjà vide


31

Dans le cadre d'un script de déploiement, je veux vider des éléments mis en cache de mon répertoire temporaire. J'utilise une commande comme:

rm /tmp/our_cache/*

Cependant, s'il /tmp/our_cacheest vide (assez courant lors de la transmission rapide de nombreuses modifications à notre serveur de test), cela affiche le message d'erreur suivant:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

Ce n'est pas un gros problème, mais c'est un peu moche et je veux réduire le rapport bruit / signal dans la sortie de ce script.

Qu'est-ce qu'un moyen concis sous Unix pour supprimer le contenu d'un répertoire sans recevoir de messages se plaignant que le répertoire est déjà vide?

Réponses:


48

Étant donné que vous souhaitez probablement supprimer tous les fichiers sans invite, pourquoi ne pas simplement utiliser le -fcommutateur rmpour ignorer les fichiers inexistants?

rm -f /tmp/our_cache/*

Depuis la page de manuel:

-f, --force
          ignore nonexistent files, never prompt

De plus, s'il peut y avoir des sous-répertoires dans /tmp/our_cache/et que vous souhaitez que ceux-ci et leur contenu soient également supprimés, n'oubliez pas le -rcommutateur.


3
solution la plus évidente et je n'y ai pas pensé! Je me sens comme le premier gars sur cette bande dessinée xkcd.com/399 ;-)
Huygens

6
find /tmp/our_cache/ -mindepth 1 -delete

Modifier 1

supprimé "-type f

Modifier 2

Ajout d'une option non standard -mindepth 1afin d'empêcher le répertoire racine de recherche d'être supprimé (après avoir supprimé la -type flimitation).


Juste une note, je laisserais de côté -type fcar il peut aussi y avoir des répertoires temporaires (bien que l'exemple de la question ne les explique pas, ils ne sont probablement pas là ...)
Izkata

1
l'utilisation -type fne supprimera que les fichiers normaux, donc les liens symboliques par exemple ne seront pas supprimés.
Huygens

@rush Désolé, je n'ai pas vérifié cela, mais j'ai juste regardé les pages de manuel qui disent "Supprimer les fichiers", sans mentionner les répertoires de toute façon. Je supprime mon commentaire.
Hauke ​​Laging

1
Cela supprime /tmp/our_cachedonc vous pourriez aussi bien le faire rm -r /tmp/our_cache. Pendant que vous utilisez des options non standard, vous pouvez utiliser -mindepth 1. Notez que contrairement à rm /tmp/our_cache/*, il supprime également les sous-répertoires, leur contenu et les fichiers cachés.
Stéphane Chazelas

2

Vous pouvez rediriger l'erreur standard vers /dev/nullpour ne pas l'imprimer

$  rm /tmp/our_cache/* 2>/dev/null

2
Cela ne supprimerait-il pas également les erreurs affichées si, par exemple, un fichier ne peut pas être supprimé car il est en cours d'utilisation? La seule erreur que je souhaite supprimer est celle indiquée si le répertoire cible est vide; cela semble avoir des effets secondaires indésirables.
Mark Amery

Même si vous essayez de supprimer un fichier qu'un processus a ouvert, vous n'obtiendrez pas d'erreur.
pradeepchhetri

1

Une autre façon (bien que légèrement exagérée ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

cela utilise testou [pour tester si la chaîne renvoyée par l'exécution d'un lssur votre répertoire n'est pas vide. Ensuite, si et seulement si cette chaîne n'est PAS vide, elle supprime tout sous votre répertoire.

REMARQUE: laisser le glob hors du lssupprimera l'erreur de l'absence de fichiers.


-1

Si votre script utilise BASH, vous pouvez essayer:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

Cela produira toujours une erreur s'il y a un "vrai" problème ou si un fichier est protégé (vous auriez alors besoin du -fmodificateur de rmpour supprimer ce type de fichiers) mais évitera l'erreur quand aucun fichier n'est là.

Si vous utilisez un autre shell que BASH pour vos scripts, comme zsh, ksh, vous pouvez essayer cette autre syntaxe qui pourrait être plus portable:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
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.