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
)
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:
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
) stderr
pour supprimer les messages d'erreur (= bruit)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.find
n'est pas vide, le répertoire n'est pas vide et grep -q .
sort avec succès.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.
GNU find vous permettra de le faire
find . -maxdepth 0 -empty -exec echo {} is empty. \;
assez rapide et pas de tuyaux
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