Je garde mes fichiers dot sous contrôle de version et le script qui les déploie crée des liens durs. J'utilise également etckeeper
pour mettre mon /etc
contrôle de version sous. Récemment, j'ai reçu des avertissements comme celui-ci:
warning: hard-linked files could cause problems with bzr
Une simple copie ( cp filename.ext filename.ext
) ne fonctionnera pas:
cp: `filename.ext' and `filename.ext' are the same file
Renommer / déplacer un fichier - sauf sur plusieurs volumes - ne rompt pas non plus le lien dur.
Ma question est donc la suivante: existe-t-il un moyen de rompre un lien dur vers un fichier sans avoir à savoir où se trouvent / sont les autres liens durs vers ce fichier?
Réponses:
Rendre scriptable:
Faire la copie d'abord, puis la déplacer, a l'avantage que le fichier passe atomiquement d'un lien dur à une copie distincte (il n'y a aucun moment où il
filename
est partiel ou manquant).la source
Vous voulez probablement dire que vous souhaitez diviser le lien physique en un fichier séparé et indépendant.
Un lien physique est la connexion entre une entrée dans le répertoire et le bloc inode sur le disque.
les inodes stockent les métadonnées des fichiers, et pour les petits fichiers, certains systèmes de fichiers stockent les données dans l'inode, sinon pointeurs vers les blocs de données, et pour les très gros fichiers, listes indirectes et doubles-indirectes de pointeurs vers les unités d'allocation de disque.
Quoi qu'il en soit, la connexion entre le nom de fichier (qui est ce que produit la commande ls) et le bloc inode qui stocke ces métadonnées, est appelée un lien dur.
Avoir plusieurs liens durs vers un seul fichier signifie le même inode référencé par plusieurs entrées de répertoire, éventuellement dans des répertoires différents (sur un seul système de fichiers)
rm supprime l'entrée du nom de fichier du répertoire. Une fois qu'un inode n'est plus référencé par aucun fichier, son espace est libéré pour être utilisé par d'autres fichiers.
la source
cp
et lesmv
exemples impliquaient. Donc, je ne vois aucun moyen d'utiliser un fichier temporaire.cp -a
(au moins GNU coreutils).Mettez-le à la fin de votre fichier ~ / .bashrc.
Exécutez-le comme ça
la source
La meilleure façon de le faire avec un script bash serait quelque chose comme ceci:
points à noter:
mktemp
pour générer un fichier dont il est garanti qu'il n'existe pas-f
pour forcer l'écrasement et--preserve=all
pour garder les métadonnées aussi similaires que possible au fichier d'origine--
et"
pour citer des chemins contenant des espaces et / ou commençant par-
Faire le remplacement sans créer de fichier temporaire n'est pas possible avec les appels système Linux actuels (3.16): bien qu'il soit possible d'écraser un fichier atomiquement (c'est-à-dire de supprimer l'ancien fichier et de le remplacer par un nouveau en une seule opération), il n'est pas possible de le faire avec un fichier qui n'a pas de nom sur le système de fichiers (c'est-à-dire un fichier temporaire créé en utilisant l'
O_TMPFILE
indicateur deopen
fonction) car larename
fonction nécessite un nom de fichier en entrée (il n'y a pas de versionrename
qui prend en entrée un descripteur de fichier - voir ici pour plus de détails)la source
dirname
etmktemp
. Correction de cela pour vous ...$( ... )
substitution de commande de style. Une raison pour laquelle c'est plus agréable que le` ... `
style.`
vous mettre`\``
dedans : (bien sûr, j'ai double-échappé pour le faire vous montrer ce que vous tapez).La commande que vous recherchez est
unlink
la source
cp
etmv
je voulais dire clairement que je souhaite que le fichier existe par la suite.Si vous recherchez tous les noms de fichiers liés en dur à ce fichier, vous pouvez utiliser:
aussi
ls -il myknowhardlinkfile
vous montrer le nombre de nom de fichier au même lien fixe inode (troisième champ).la source