148 votes

Vérifier à partir du shell script si un répertoire contient des fichiers

A partir d'un shell script, comment vérifier si un répertoire contient des fichiers ?

Quelque chose de similaire à ceci

if [ -e /some/dir/* ]; then echo "huzzah"; fi;

mais qui fonctionne si le répertoire contient un ou plusieurs fichiers (celle ci-dessus ne fonctionne qu'avec exactement 0 ou 1 fichier).

177voto

olibre Points 6069

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-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...

89voto

Bruno De Fraine Points 11478

Les solutions proposées jusqu'à présent utilisent ls . Voici une solution tout en bash :

#!/bin/bash
shopt -s nullglob dotglob     # To include hidden files
files=(/some/dir/*)
if [ ${#files[@]} -gt 0 ]; then echo "huzzah"; fi

54voto

mweerden Points 4291

Que pensez-vous de ce qui suit :

if find /some/dir/ -maxdepth 0 -empty | read v; then echo "Empty dir"; fi

De cette façon, il n'est pas nécessaire de générer une liste complète du contenu du répertoire. Le site read est à la fois d'écarter la sortie et de faire en sorte que l'expression n'évalue à true que lorsque quelque chose est lu (i.e. /some/dir/ est trouvé vide par find ).

27voto

Greg Hewgill Points 356191

Essayez :

if [ ! -z `ls /some/dir/*` ]; then echo "huzzah"; fi

16voto

gr8can8dian Points 71
# Works on hidden files, directories and regular files
### isEmpty()
# This function takes one parameter:
# $1 is the directory to check
# Echoes "huzzah" if the directory has files
function isEmpty(){
  if [ "$(ls -A $1)" ]; then
    echo "huzzah"
  else 
    echo "has no files"
  fi
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X