Comment savoir si deux fichiers sont liés en dur à partir de la ligne de commande? par exemple quelque chose lier ceci:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
Comment savoir si deux fichiers sont liés en dur à partir de la ligne de commande? par exemple quelque chose lier ceci:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
Réponses:
Sur la plupart des systèmes de fichiers¹, un fichier est uniquement déterminé par son numéro d' inode , il vous suffit donc de vérifier si les deux fichiers ont le même numéro d'inode et se trouvent sur le même système de fichiers.
Ash, ksh, bash et zsh ont une construction qui vérifie pour vous: l'opérateur d'égalité de fichier -ef
.
[ fileA -ef fileB ] && ! [ fileA -ef fileC ]
Pour les cas plus avancés, ls -i /path/to/file
répertorie le numéro d'inode d'un fichier. df -P /path/to/file
montre sur quel système de fichiers se trouve le fichier (si deux fichiers se trouvent dans le même répertoire, ils se trouvent sur le même système de fichiers). Si votre système dispose de la stat
commande, elle peut probablement afficher les numéros d'inode et de système de fichiers ( stat
varie d'un système à l'autre, consultez votre documentation). Si vous voulez un rapide coup d'œil sur les liens durs à l'intérieur d'un répertoire, essayez ls -i | sort
(éventuellement canalisé vers awk ).
¹ Tous les systèmes de fichiers Unix natifs, et quelques autres tels que NTFS, mais peut-être pas des cas exotiques comme CramFS.
fileA -ef fileB
renvoie également 0
(succès) si fileA
est un lien symbolique vers fileB
, ou vice versa, ou les deux sont liés au même fichier.
[ .bashrc -ef .bash/.bashrc ]
est correct. Sans contexte, bien sûr, je n'ai aucune idée pourquoi cela «n'a pas vraiment fonctionné» - vous pourriez comparer les mauvais fichiers, vous pourriez ne pas vérifier correctement le résultat, vous pourriez utiliser un shell sans -ef
, ...
[
et est un synonyme de test
. Mais man [
ou man test
vous donnera la page de manuel de la commande externe, alors que presque tous les shell ont une commande intégrée avec des options légèrement différentes, vous devez donc rechercher celle-ci dans le manuel de votre shell.
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
stat -c %d
). Et si vous êtes sous Linux (compte tenu de votre stat
commande), votre shell a le droit [ fileA -ef fileB ]
de faire tout cela directement. De plus, votre commande rompt gratuitement avec les noms de fichiers contenant des espaces ou \[?*
, ou commence par -
: mettez toujours des guillemets autour des commandes susbtitutions ( "$(stat -c %i -- "$1")"
).
function
mot - clé abjectement non portable avec un nom de fonction qui (à cause de la présence d'un tiret) viole les conventions POSIX sur les noms autorisés?
$1
et $2
. Vous souhaiterez peut-être également utiliser la $()
syntaxe au lieu des backticks car les crochets indiquent clairement où la commande commence et où elle se termine et l'imbrication est plus simple.
Comme le suggère la première affiche, vous pouvez écrire un script basé sur quelque chose comme ça sous Linux:
stat -c '%i' fileA fileB fileC
stat -c %d
). Et si vous êtes sous Linux (compte tenu de votre stat
commande), votre shell a le droit [ fileA -ef fileB ]
de faire tout cela directement.
Avec GNU find(1)
version 4.2.11 ou plus récente, vous pouvez également utiliser ceci:
if [ "yes" = "$(find fileA -samefile fileB -exec echo yes \;)" ]; then
echo yes
else
echo no
fi
Si fileA
est le même fichier que fileB
puis find
imprimera « oui » et la condition devient vraie.
Contrairement à l'utilisation de l'opérateur d'égalité de fichiers, -ef
cela engendrera un nouveau processus.