Je vois que cette question est en train de devenir populaire… J'ai répondu à ma propre question ci-dessous… .. Ce qui dit Inian est correct et m'a aidé à mieux analyser mon code source.
Mon problème était dans la FIND
et non dans la RM
. Ma réponse donne un bloc de code, que j'utilise actuellement, pour éviter les problèmes lorsque FIND ne trouve rien, mais transmet quand même des arguments à RM, provoquant l'erreur mentionnée ci-dessus.
VIEILLE QUESTION CI-DESSOUS
J'écris beaucoup et beaucoup de versions différentes de la même commande. Tous sont exécutés mais avec une erreur/info:
rm: missing operand
Try 'rm --help' for more information.
Ce sont les commandes que j'utilise:
#!/bin/bash
BDIR=/home/user/backup
find ${BDIR} -type d -mtime +180 -print -exec rm -rf {} \;
find ${BDIR} -type d -mtime +180 -print -exec rm -rf {} +
find "$BDIR" -type d -mtime +180 -print -exec rm -rf {} \;
find "$BDIR" -depth -type d -mtime +180 -print -exec rm -rf {} \;
find ${BDIR} -depth -type d -mtime +180 -print -exec rm -rf {} +
find $BDIR -type d -mtime +180 -print0 | xargs -0 rm -rf
DEL=$(FIND $BDIR -type d -mtime +180 -print)
rm -rf $DEL
Je suis sûr que tous ont raison (car ils font tous leur travail), et si je les lance manuellement, je ne récupère pas ce message, mais dans un script .sh, je le fais.
EDIT: depuis que j'ai beaucoup de ces RM, le problème pourrait être ailleurs. Je les vérifie tous. Tous les codes ci-dessus fonctionnent, mais la meilleure réponse est celle marquée;)
Le problème est que lorsque vous utilisez find/grep
avec xargs
, vous devez vous assurer d’exécuter la commande piped uniquement si la commande précédente a abouti. Comme dans le cas précédent, si la commande find
ne produit aucun résultat de recherche, la commande rm
est appelée avec une liste d'arguments vide.
La page man
de xargs
-r Compatibility with GNU xargs. The GNU version of xargs runs the
utility argument at least once, even if xargs input is empty, and
it supports a -r option to inhibit this behavior. The FreeBSD
version of xargs does not run the utility argument on empty
input, but it supports the -r option for command-line compatibil-
ity with GNU xargs, but the -r option does nothing in the FreeBSD
version of xargs.
De plus, vous ne devez pas essayer toutes les commandes comme si vous aviez collé la simple ci-dessous qui correspond à vos besoins.
Ajoutez l'argument -r
à xargs comme
find "$BDIR" -type d -mtime +180 -print0 | xargs -0 -r rm -rf
L'option -f
de rm
supprime l'erreur rm: missing operand
:
-f, --force
ignore nonexistent files and arguments, never Prompt
Après des recherches, la commande avec laquelle je suis à l'aise est la suivante:
HOME=/home/user
FDEL=$HOME/foldersToDelete
BDIR=/backup/my_old_folders
FLOG=/var/log/delete_old_backup.log
find ${BDIR} -mindepth 1 -daystart -type d -mtime +180 -printf "%f\n" > ${FDEL}
if [[ $? -eq 0 && $(wc -l < ${FDEL}) -gt 0 ]]; then
cd ${BDIR}
xargs -d '\n' -a ${FDEL} rm -rf
LOG=" - Folders older than 180 were deleted"
else
LOG=" - There aren't folders older than 180 days to delete"
fi
echo ${LOG} >> ${FLOG}
Pourquoi? Je recherche tous les anciens dossiers que je veux supprimer et les imprime tous dans un fichier, quel que soit leur nom, avec ou sans espace. Si le fichier est supérieur à 0 octet, cela signifie qu'il existe un dossier pour lequel je ne veux plus.
Si votre 'FIND' échoue avec un opérande 'rm: missing', il ne vous faudra probablement pas chercher dans le RM plutôt que dans le FIND lui-même. Un bon moyen de supprimer le fichier à l’aide de FIND est celui que j’ai cru partager avec vous.