Les trois meilleures astuces
shopt -s nullglob dotglob; f=your/dir/*; ((${#f}))
Cette astuce est 100% bash
et invoque (spawns) un sous-shell. L'idée vient de Bruno De Fraine et améliorée par teambob commentaire.
files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} ))
then
echo "contains files"
else
echo "empty (or does not exist or is a file)"
fi
Note : aucune différence entre un répertoire vide et un répertoire inexistant (et même lorsque le chemin fourni est un fichier).
Il existe une alternative similaire et plus de détails (et plus d'exemples) sur le site de l officiel FAQ pour le canal IRC #bash :
if (shopt -s nullglob dotglob; f=(*); ((${#f[@]})))
then
echo "contains files"
else
echo "empty (or does not exist, or is a file)"
fi
[ -n "$(ls -A your/dir)" ]
Cette astuce est inspirée de L'article de nixCraft posté en 2007. Ajouter 2>/dev/null
pour supprimer l'erreur de sortie "No such file or directory"
.
Voir aussi Andrew Taylor (2008) et gr8can8dian Réponse de la Commission (2011).
if [ -n "$(ls -A your/dir 2>/dev/null)" ]
then
echo "contains files (or is a file)"
else
echo "empty (or does not exist)"
fi
ou la version bashisme en une ligne :
[[ $(ls -A your/dir) ]] && echo "contains files" || echo "empty"
Note : ls
renvoie à $?=2
lorsque le répertoire n'existe pas. Mais aucune différence entre un fichier et un répertoire vide.
[ -n "$(find your/dir -prune -empty)" ]
Cette dernière astuce est inspirée de Réponse de gravstar où -maxdepth 0
est remplacé par -prune
et améliorée par phils commentaire.
if [ -n "$(find your/dir -prune -empty 2>/dev/null)" ]
then
echo "empty (directory or file)"
else
echo "contains files (or does not exist)"
fi
une variante utilisant -type d
:
if [ -n "$(find your/dir -prune -empty -type d 2>/dev/null)" ]
then
echo "empty directory"
else
echo "contains files (or does not exist or is not a directory)"
fi
Explication :
-
find -prune
est similaire à find -maxdepth 0
utiliser moins de caractères
-
find -empty
imprime les répertoires et fichiers vides
-
find -type d
imprime uniquement les répertoires
Note : Vous pouvez également remplacer [ -n "$(find your/dir -prune -empty)" ]
par la version abrégée ci-dessous :
if [ `find your/dir -prune -empty 2>/dev/null` ]
then
echo "empty (directory or file)"
else
echo "contains files (or does not exist)"
fi
Ce dernier code fonctionne dans la plupart des cas mais attention, les chemins malveillants peuvent exprimer une commande...