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