Cette question est similaire à What is the safest way to empty a directory in *nix?Safe rm fonction -rf en script shell
J'écris script bash qui définit plusieurs constantes de chemin et les utilisera pour le fichier et la manipulation de répertoire (copier, renommer et supprimer). Souvent, il sera nécessaire de faire quelque chose comme:
rm -rf "/${PATH1}"
rm -rf "${PATH2}/"*
Tout en développant ce script je veux me protéger des noms comme mistyping PATH1 et CHEMIN2 et éviter les situations où ils sont étendus à une chaîne vide, entraînant ainsi l'essuyage disque entier. J'ai décidé de créer emballage spécial:
rmrf() {
if [[ $1 =~ "regex" ]]; then
echo "Ignoring possibly unsafe path ${1}"
exit 1
fi
shopt -s dotglob
rm -rf -- $1
shopt -u dotglob
}
qui sera appelé:
rmrf "/${PATH1}"
rmrf "${PATH2}/"*
Regex (ou l'expression sed) devrait prendre des chemins comme "*", "/ *", «/**/"," /// * "etc. mais autorise des chemins comme" dir ","/dir ","/dir1/dir2/","/dir1/dir2/* ". Aussi je ne sais pas comment activer la globalisation de shell dans le cas comme "/ dir avec espace/*". Des idées?
EDIT: voilà ce que je suis venu avec à ce jour:
rmrf() {
local RES
local RMPATH="${1}"
SAFE=$(echo "${RMPATH}" | sed -r 's:^((\.?\*+/+)+.*|(/+\.?\*+)+.*|[\.\*/]+|.*/\.\*+)$::g')
if [ -z "${SAFE}" ]; then
echo "ERROR! Unsafe deletion of ${RMPATH}"
return 1
fi
shopt -s dotglob
if [ '*' == "${RMPATH: -1}" ]; then
echo rm -rf -- "${RMPATH/%\*/}"*
RES=$?
else
echo rm -rf -- "${RMPATH}"
RES=$?
fi
shopt -u dotglob
return $RES
}
Utilisation prévue est (note un astérisque intérieur guillemets):
rmrf "${SOMEPATH}"
rmrf "${SOMEPATH}/*"
où somepath $ a est système ou/home (dans mon cas, toutes ces opérations sont effectuées sur un système de fichiers monté sous le répertoire/scratch).
: CAVEATS
- pas testé très bien
- pas l'intention d'utiliser des chemins pouvant contenir '..' ou '' Rm -rf avec astérisque peut probablement échouer s'il y a trop de fichiers ou de répertoires dans $ SOMEPATH (en raison de la longueur limitée de la ligne de commande) - cela peut être corrigé avec 'pour 'commande loop ou' find '
Merci! Je ne savais pas à propos de cette option. En fait, il s'appelle --preserve-root et n'est pas mentionné dans la page de manuel. – Max
Sur mon système, cette option est activée par défaut, mais elle ne sert à rien dans le cas de rm -ri/* – Max