J'ai un dossier appelé statistics
sur un serveur Ubuntu dans lequel les fichiers de données sont régulièrement stockés. Comment puis-je renommer un statistics
dossier en backup-xx
recréant le statistics
dossier pour qu'il soit disponible pour stocker de nouveaux fichiers?
Les fichiers du statistics
dossier sont créés par PHP file_put_contents
.
Je préfère renommer le dossier, car il contient de nombreux fichiers statistics
.
bash
shell-script
files
rename
Googlebot
la source
la source
Réponses:
Cela renommerait le
statistics
répertoire existant enbackup-xx
, et si cela réussit, il continuerait à créer un nouveaustatistics
répertoire.Pour une opération plus atomique, envisagez de créer un répertoire
statistics-001
(ou similaire, peut-être en le remplaçant001
par la date d'aujourd'hui dans un format approprié), et un lien symbolique vers celui-ci appeléstatistics
:Lorsque vous souhaitez "faire pivoter" ceci afin que les nouvelles données soient placées dans un répertoire propre, créez d'abord le répertoire, puis recréez le
statistics
lien vers celui-ci:De cette façon, toute écriture de programme dans le
statistics
répertoire (le répertoire que ce lien symbolique) ne sera jamais à 1 ne parviennent pas à le trouver.Si vous avez besoin d'autorisations spéciales ou de propriété définies sur le répertoire vers lequel vous vous
statistics
dirigez, définissez-les avant de (re) créer le lien.1 Ou plutôt, de cette façon, le temps qu'un programme serait sans répertoire cible valide est minimisé autant que possible en utilisant les outils Unix standard.
la source
chown --reference=backup-xx statistics ; chmod --reference=backup-xx statistics
définir des propriétés et des autorisations. Idéalement, vous feriez cela avant de renommer, donc unmkdir new ; chown ; chmod ; mv stats backup ; mv new stats
processus de type.ln -sf
n'est pas atomique. Il est spécifié de dissocier l'ancien lien symbolique puis d'en créer un nouveau, qui est nécessairement non atomique. Au lieu de cela, vous devez créer un lien symbolique temporaire supplémentaire et utiliser larename
fonction (via lamv
commande, par exemple) pour remplacer atomiquement l'ancien. Voir mon approche ici: git.musl-libc.org/cgit/musl/tree/tools/…Il n'y a aucun moyen de remplacer atomiquement un répertoire par un autre répertoire. Vous pouvez déplacer l'ancien répertoire puis créer un nouveau répertoire:
Mais cela laisse une petite fenêtre de temps pendant laquelle
statistics
n'existe pas. C'est un problème si un processus peut à tout moment déposer des fichiers dans le répertoire.Pour remplacer efficacement un répertoire de manière atomique, vous devez utiliser des liens symboliques. Créez un répertoire dont le nom inclut la période de temps depuis le début:
(ou comme vous voulez choisir la convention de dénomination des répertoires). Créez un lien symbolique avec un nom fixe vers l'emplacement actuel:
Pour remplacer le répertoire, créez d'abord un nouveau répertoire et un nouveau lien symbolique, puis déplacez-le pour remplacer l'ancien lien symbolique. Notez que ni une plaine
mv
sur le lien symbolique ni une plaineln -s
ne le feront: ils créeraient une entrée dans le répertoire cible. GNU coreutilsln -snf
ne convient pas non plus car il supprime le lien symbolique existant avant d'en créer un nouveau, ce qui laisse une petite fenêtre de temps pendant laquelle le chemin n'existe pas. Vous pouvez utiliser GNU coreutilsmv -T
sur le nouveau lien symbolique.la source
busybox
'ln -sf
n'est pas non plus atomique, je ne connais aucune implémentation.openat()
ou CWD). Je déplacerais seulement le contenu du répertoire vers un nouveau. C'est encore dangereux pour les fichiers ouverts, mais un peu mieux. Dans le doute, utilisez celuilogrotate
qui doit respecter au mieux ces questions.symlink
appel système n'écrasera pas un fichier existant, il est donc impossible de commuter directement un lien symbolique de manière atomique, malheureusement. L'rename
appel système écrasera un fichier existant, mais de façon ennuyeuse, il n'existe aucun moyen portable de le faire dans le shell; c'est possible avec GNU coreutils grâce à l'-T
option.Ne renommez pas du tout le répertoire. Vous avez dit que vous préférez renommer le répertoire car il contient beaucoup de fichiers. La seule raison pour laquelle je peux penser que vous le voudriez est que la copie des fichiers prendrait trop de temps. Cependant, le déplacement (c'est-à-dire le changement de nom) des fichiers est instantané tant qu'ils sont déplacés vers un emplacement sur le même système de fichiers. Je suppose que c'est ce que vous devez faire, car si vous changez de système de fichiers,
mv
cela prendra autant de temps quecp
s'il déplace un répertoire ou son contenu.Alors, faites simplement:
Si vous devez également obtenir des fichiers cachés, vous pouvez faire:
Ou, si vous utilisez
bash
:De cette façon, le répertoire est toujours là mais vous déplacez toujours son contenu en une opération simple et rapide.
la source
Vous pouvez déplacer le contenu du dossier des statistiques vers un répertoire nouvellement créé plutôt que de déplacer le dossier lui-même. Si vous déplacez un dossier entier, vous devrez exécuter une autre commande pour modifier les autorisations de répertoire.
la source