web-dev-qa-db-fra.com

Supprimer tous les fichiers ayant l'extension '.sh' mais garder un fichier correspondant à l'extension par terminal

En fait, ce genre de trop demander, je pense.

Mais je veux supprimer tous les fichiers correspondant à l'extension ".sh" (dossier actuel uniquement), ce que je peux faire avec la commande ci-dessous:

find . -maxdepth 1 -type f -name '*.sh' -exec rm {} +

Mais je veux toujours garder le fichier "cron.sh" dans le dossier actuel non affecté.

Comment puis-je y parvenir en ligne de commande unique?

3
Vicky Dev

Vous pouvez utiliser -not:

find . -maxdepth 1 -type f -name '*.sh' -not -name cron.sh -delete

De plus, GNU find a l'option -delete qui est plus simple à utiliser et que rm -rf.

Important: Mettez toujours -delete à la fin. Comme expliqué dans man find:

Avertissements: N'oubliez pas que la ligne de commande find est évaluée en tant qu'expression. Par conséquent, si vous mettez -delete en premier, find essayera de supprimer tout ce qui se trouve sous les points de départ que vous avez spécifiés.


Sinon, vous pouvez utiliser une boucle Shell (mais la commande find ci-dessus est beaucoup plus efficace):

for f in *.sh; do [ "$f" = "cron.sh" ] || rm "$f"; done
5
terdon

Un autre moyen, mais plus lent que le grand exemple find de terdon consiste à utiliser mv et rm commandes chaînées avec et opérateurs.

mv cron.sh cron.sh.safe && rm *.sh && mv cron.sh.safe cron.sh

Cela se plaindra si vous avez des répertoires nommés quelquechose.sh, mais ne les supprimez pas.

1
Arronical