N'utilisez pas de substitution de commande à la sortie defind
. Ici, tout peut être fait avec find
:
find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null
Avec quelques find
implémentations (y compris FreeBSD d' find
où il provient et GNU find
), vous pouvez utiliser à la -delete
place de -exec rm...
.
La raison pour laquelle vous obtenez une erreur est qu’il n’ya pas de commande entre then
etelse
et que certains shells (à commencer par le shell Bourne d'où provient cette syntaxe) en nécessitent au moins un (et un commentaire n'est pas une commande). Notez que c'est complètement arbitraire et qu'il n'y a aucune raison pour que ces obus fassent cela. yash
et zsh
ne pas avoir cette limitation ( if false; then else echo x; fi
et même if false; then else fi
bien travailler avec eux).
Comme d’autres l'ont déjà dit, vous pouvez utiliser une commande noop du type :
(ou for nothing in; do nothing; done
) ou inverser la logique avec le !
mot clé (disponible dans les shells POSIX, mais pas dans le shell Bourne (vous constaterez que l'utilisation de:
de cela était courante dans ce shell)). mksh
et yash
arriver à soutenir if false; then () else echo x; fi
(je ne compterais pas dessus car cela pourrait changer dans les versions futures cependant).
Une autre approche est avec:
lsof... || {
cmd1
cmd2
}
si une différence est le statut de sortie global qui sera celui de lsof
si lsof
échoue.
Stéphane Chazelas
la source
-exec
souvent utile, tel quelxargs
, une boucle shell est parfois nécessaire. Dans ce cas, unewhile read name
boucle est l'option préférée (dans bash avec GNU find, vous pouvez utiliser l'option -0 pour les deux; vous devez obligatoirement renoncer à la nouvelle ligne).-print0
is-exec printf '%s\0' {} +
(mais de manière portable, vous ne pouvez pas gérer cette sortie sauf si vous souhaitez en tenir compteperl
), et avecfind .//.
et certains post-traitements, vous pouvez échapper aux nouvelles lignesxargs
. Notez que ce n'est pas unwhile read
, c'estwhile IFS= read -r
.Il semble que vous vouliez faire un no-op si le fichier est ouvert, vous devriez donc ajouter un
:
, qui est une commande nulle dansbash
:Si vous n'utilisez pas
:
,bash
ne peut pas analyser votre code, et affichera une erreur commebash: syntax error near unexpected token 'else'
.la source
:
et c'est la première commande listée dans bash-builtins.Une autre alternative: inversez votre logique.
la source
TL; DR
Aucune des autres réponses n'aborde réellement votre question initiale de savoir pourquoi la commande génère une erreur de syntaxe. Ceci est dû à une commande manquante entre then et else .
Une commande manquante
Votre code original ressemble à ceci:
Le problème est que vous avez un commentaire entre then et else , mais que le commentaire n'est pas traité comme une commande. En bref, vous pouvez réécrire le problème que vous avez (structurellement parlant) comme suit:
Corrigez votre syntaxe avec Bourne Builtin
Vous pouvez résoudre ce problème en plaçant des commandes réelles avant les autres , mais un commentaire par lui - même pas. La section if-then ne peut être vide; si vous voulez un espace réservé, vous pouvez utiliser le colon intégré . Par exemple:
Placer simplement
:
dans la section entre alors et else résoudra l’erreur de syntaxe que vous rencontrez.la source
$ ; -bash: syntax error near unexpected token ';'