web-dev-qa-db-fra.com

Bash vérifiant si le dossier a du contenu

J'essaie de créer un script Bash qui supprimera tout dans mon .waste répertoire. J'ai un script de base que j'ai écrit mais je veux d'abord vérifier si le .waste le répertoire a du contenu, et si oui, pour faire écho à un simple "Folder already empty!" message. Je ne suis pas trop averti sur if et if else déclarations, et je ne sais pas ce que le [ ] l'équation doit vérifier la présence.

Code de base:

#! /bin/bash
echo "The files have been deleted:"
cd /home/user/bin/.waste/
ls
rm -rf /home/user/bin/.waste/*

(P.S. ne sais pas si l'astérisque est correct à la fin, j'ai essayé le script avec lui et je me souviens qu'il a également tout supprimé dans le répertoire bin)

36
Syler

Vous pouvez vérifier si un répertoire est vide en utilisant find et en traitant sa sortie:

#!/bin/sh
target=$1
if find "$target" -mindepth 1 -print -quit 2>/dev/null | grep -q .; then
    echo "Not empty, do something"
else
    echo "Target '$target' is empty or not a directory"
fi

C'est:

  • Utilisez find pour trouver la première entrée du système de fichiers sous $target (-mindepth 1), imprime le (-print) et arrêter le traitement (-quit)
    • Rediriger stderr pour supprimer les messages d'erreur (= bruit)
  • Vérifiez si la sortie de la commande find est vide à l'aide de grep -q .
    • grep -q . se fermera après avoir traité au plus un caractère. S'il voit un personnage qu'il quitte avec succès, s'il ne le fait pas (son entrée est vide), alors il sort avec échec.
  • Si la sortie de la commande find n'est pas vide, le répertoire n'est pas vide et grep -q . sort avec succès.
  • Si la sortie de la commande find est vide, alors $target est soit un répertoire vide, soit pas un répertoire (n'existe pas), et grep -q . se termine avec échec.

La raison pour laquelle nous devons nous fier directement à stdout de find plutôt qu'à son propre code de sortie est qu'il n'y a aucun moyen de faire en sorte que la commande find utilise des codes de sortie distinctes dans les fichiers de cas. ont été trouvés ou non.

Au lieu de diriger vers grep -q, une autre alternative serait de capturer la sortie de find et de vérifier s'il s'agit d'une chaîne vide ou non.

#!/bin/sh
target=$1
if [ "$(find "$target" -mindepth 1 -print -quit 2>/dev/null)" ]; then
    echo "Not empty, do something"
else
    echo "Target '$target' is empty or not a directory"
fi

La capture d'une sortie de commande comme celle-ci utilise un sous-shell. Je pense que la solution utilisant grep est probablement plus rapide, mais je ne l'ai pas testée.

41
janos

GNU find vous permettra de le faire

find . -maxdepth 0 -empty -exec echo {} is empty. \;

assez rapide et pas de tuyaux

15
kdubs

Désolé, je n'ai pas assez de représentant pour répondre au commentaire de Dominik avec un commentaire, c'est donc le mieux que je puisse faire ...

Ma recherche sur Solaris n'a pas d'option maxdepth ... comment puis-je obtenir la même chose? - Dominik 14 novembre à 12:46

Je ne peux pas dire avec certitude sur les versions antérieures, mais sur Solaris 10 ou mieux:

find . ! -name . -Prune 
4
Reese Murdock