Est-ce bon pour avoir un directory vide?

Je voudrais avoir un directory mydir avec du contenu vide, mais je ne sais pas à l'avance s'il existe déjà, ou quand il le fait, s'il est vide. Donc mon path est

 mkdir -p mydir rm -f mydir/* 

Y a-t-il un défaut? Quelle est votre meilleure solution?

La faille est que vous utilisez une suppression automatique forcée d'un directory et bien sûr pour supprimer son contenu, vous auriez besoin d'une suppression automatique forcée récursive d'un directory. Vous vous ouvrez à des trous de security dans votre script.

Par exemple, consultez l' --one-file-system pour rm . Vous ne voudriez probablement pas supprimer tous les files dans les filesystems montés dans mydir … vous mydir donc inclure ce drapeau (qui n'a pas d'abréviation d'ailleurs).

Aussi, qu'en est-il des fixations? (Voir man mount et search for bind .) Ce seraient des files techniquement sur le même système de files … comment rm -rf les rm -rf ? Est-ce que ça les supprimerait tous? Ce n'est probablement pas ce que vous vouliez, mais pour être sûr que vous auriez à faire des searchs et à tester le comportement de rm par rapport aux fixations. Il y a probablement beaucoup d'autres cas marginaux auxquels je n'ai pas pensé.

Tout ce problème vient parce que vous ne voulez pas vraiment "supprimer un directory et son contenu"; ce que vous voulez réellement est d' avoir un directory vide pour travailler.

Il y a un principe général – lorsque vous spécifiez autre chose que ce que vous voulez précisément, parce que vous pensez que c'est un moyen d'get ce que vous voulez, vous introduisez habituellement une complexité inutile. La chose à faire est de find comment spécifier ce que vous voulez et ensuite spécifier explicitement. *


La meilleure solution, comme Jeff Schaller l'a déjà souligné dans les commentaires, est d'utiliser mktemp , qui est en fait conçu à cet effet. Spécifiquement, de l' man mktemp :

 Create a temporary file or directory, safely, and print its name. 

L'utilisation la plus simple de mktemp pour créer un directory ressemblerait à ceci:

 mydir="$(mktemp -d)" 

Ensuite, vous pouvez copyr un file comme ceci:

 cp somefile "$mydir/" 

À la fin de votre script, lorsque vous avez terminé avec le directory, vous pouvez le supprimer en toute security (et tout ce que vous avez mis) en utilisant:

 rm -rf "$mydir" 

* Un autre exemple de ce principe est l'utilisation de commands sed pour gérer des files basés sur des champs ou des colonnes. Vous pouvez peut-être le faire … mais vous pouvez spécifier exactement ce que vous voulez en utilisant awk , et avec beaucoup less de complexité.

mkdir échoue parce qu'il le devrait. C'est une bonne chose. Une command qui échoue est une command qui fonctionne . Il vous returnne correctement un code d'erreur testable. Et donc la chose simple à faire est de le tester.

 :& cd -P "${TMPDIR:-/tmp}" || exit x=$(((z=($$+$!)/2+1000)-1001)) until mkdir -ma=,u=rwx "work.$0.$((x+=1))" && cd -- "work.$0.$x" do [ "$x" -lt "$z" ] || ! break done 2>/dev/null && WORK=$PWD exec 9<.