web-dev-qa-db-fra.com

Comment vérifier si la commande find n'a rien trouvé (bash, openSUSE)?

Je sais qu'il est possible d'utiliser une boucle avec la commande find comme ça

for i in `find $something`; do (...) done

mais je veux utiliser la commande find avec "if".

J'essaie de créer des commentaires de progression (et des fichiers journaux plus tard) à propos des fichiers supprimés par mon script. J'ai besoin de vérifier si

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS

trouvé quelque chose ou pas. Sinon, je veux dire echo 'Vous n'avez pas de fichiers plus anciens que $ DAYS days' ou quelque chose comme ça;)

Comment puis-je faire cela dans un script Shell?

10
Izzy

Comptez le nombre de lignes générées et stockez-le dans une variable, puis testez-le:

lines=$(find ... | wc -l)
if [ $lines -eq 0 ]; then
...
fi
9
Mark Setchell

Vous voulez utiliser find command inside an si la condition , vous pouvez essayer ce liner:

 [[ ! -z `find 'YOUR_DIR/' -name 'something'` ]] && echo "found" || echo "not found"

exemple d'utilisation:

 [Prompt] $ mkdir -p Dir/dir1 Dir/dir2/ Dir/dir3                 
 [Prompt] $ ls Dir/
 dir1  dir2  dir3
 [Prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 not found
 [Prompt] $ touch Dir/dir3/something
 [Prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 found
9
bachN

La sortie 0 est facile avec find, exit> 0 est plus difficile car cela ne se produit généralement qu'avec une erreur. Cependant, nous pouvons y arriver:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi
4
Steven Penny

Je voulais faire cela en une seule ligne si possible, mais je ne voyais pas comment trouver pour changer son code de sortie sans causer d'erreur.

Toutefois, avec vos besoins spécifiques, les éléments suivants devraient fonctionner:

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS | grep 'tar.gz' || echo "You don't have files older than $DAYS days"

Cela fonctionne en passant la sortie de find dans grep pour la même chose, retourne un code de sortie d'échec s'il ne trouve rien ou réussira et renvoyera les lignes trouvées s'il le fait.

Tout ce qui suit le || ne sera exécuté que si la commande précédente a échoué.

2
Andrew Stubbs

Itérer sur la sortie de find peut être dangereux si vos noms de fichiers contiennent des espaces. Si vous êtes sûr que ce n'est pas le cas, vous pouvez stocker le résultat de find dans un tableau et vérifier sa taille pour voir s'il y a eu des occurrences:

results=( $(find -name "$something") )
if (( ${#results[@]} )) ; then
    echo Found
else
    echo Not found
fi
for file in "${results[@]}" ; do
   # ...
done
0
choroba