web-dev-qa-db-fra.com

Erreur 'rm: opérande manquant' lors de l'utilisation de la commande 'find'

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;)

13
Nihvel

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
21
Inian

L'option -f de rm supprime l'erreur rm: missing operand:

-f, --force 
       ignore nonexistent files and arguments, never Prompt
4
Jingguo Yao

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.

1
Nihvel