diff should not follow sym-link
Jin Guojun [VFFS]
j_guojun at lbl.gov
Tue Aug 15 04:16:32 UTC 2006
I do not know what is the historical reason for program "diff" to follow
a symbolic link during the recursive diff (-r), but it seems not to be a
proper implementation.
If both compared directories contains a sym-link, which point to
a same file or directory, it obviously no need to compare it (not them).
If both compared directories contains a sym-link, which point to
a duplicated file or directory, and files or directories are duplicated in
the same tree level, these files or directories will be compared any way
during the recursive diff. So there is no need to follow the sym-link to
compare them (just waste time by doing so).
The only case that I can see that diff may follow the sym-link in
recursive comparison
is if the symlink is pointing to a duplicated directory/file in very
different
locations, which may probably rarely be created. If this is probably the
only
case "diff -r" needs to follow the sym-link, an option -L or something
similar
in other commands, such as ls, should be add for such purpose.
Otherwise, diff -r can be loop forever on large file systems if there is
some
symlinks point forth and back between some directories, users may create
them for easy to traversal around file systems.
Then the process of "diff -r" a backup file system and a live file
system will
take a day to finish till maximum symlink number is reached, and many
redundant diff information is created. See simple example below.
So, we need to either disable recursive diff to follow the symlink, or
we need a switch (option) to enable following symlink feature in recursive
comparison of diff when a user real needs it.
Any comment?
-Jin
------------- example of looping on recursive diff
------------------------
% create a simple test structure
% dir -R test # show tree structure, in real case a and b will be a
large tree
total 8
drwxr-xr-x 3 jin wheel 512 Aug 14 20:25 a/
drwxr-xr-x 2 jin wheel 512 Aug 14 20:32 b/
-rw-r--r-- 1 jin wheel 4 Aug 14 20:23 x
-rw-r--r-- 1 jin wheel 4 Aug 14 20:25 y
test/a:
total 2
drwxr-xr-x 2 jin wheel 512 Aug 14 20:25 a1/
lrwxr-xr-x 1 jin wheel 4 Aug 14 20:25 x@ -> ../x
test/a/a1:
total 0
lrwxr-xr-x 1 jin wheel 10 Aug 14 20:24 a1@ -> ../../b/a1
test/b:
total 0
lrwxr-xr-x 1 jin wheel 4 Aug 14 20:32 a1@ -> ../a
lrwxr-xr-x 1 jin wheel 4 Aug 14 20:25 x@ -> ../y
% mkdir test1
% cd test
% tar -cf - . | ( cd ../test1 ; tar -xf - )
% cd .. ; diff -r test test1
diff:
test/a/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1:
Too many levels of symbolic links
diff:
test1/a/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1:
Too many levels of symbolic links
diff:
test/a/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/x:
Too many levels of symbolic links
diff:
test1/a/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/x:
Too many levels of symbolic links
diff:
test/b/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1:
Too many levels of symbolic links
diff:
test1/b/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1/a1:
Too many levels of symbolic links
More information about the freebsd-hackers
mailing list