What is a good command for moving a directory containing relative symbolic links to files outside the directory?
Clash Royale CLAN TAG#URR8PPP
up vote
0
down vote
favorite
I like to use relative symlinks when possible because they stay valid even when my filesystem is mounted in a non-root location, for example if I am accessing it remotely.
However, if I move a directory which contains relative symlinks, in general those links become invalid.
I am looking for a command that I can use to move a whole directory (tree), rewriting only those relative symlinks that point outside the directory so that they still point to the same files.
There is a related question on Stack Overflow, How do I move a relative symbolic link?. Also, here on Unix & Linux, find all symbolic links in a directory tree pointing outside that tree, and (referring to a much harder problem) is there some kind of symbolic links that support moving or renaming the target file?.
For example, a command called mv-rel
which behaves as follows (the other commands being their GNU coreutils versions):
$ mkdir foo
$ touch bar
$ ln -sr bar foo/
$ touch foo/flob
$ ln -sr foo/flob foo/qux
$ ls -gG foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
$ mkdir baz
$ mv-rel foo/ baz
$ ls -gG baz/foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
Unless I'm missing something, this also seems like it would be a useful command-line option to the 'mv' command (maybe also 'cp'). But for the purposes of this question I am looking for something that exists now, or a simple portable script that implements this functionality.
shell symlink directory-structure coreutils
add a comment |
up vote
0
down vote
favorite
I like to use relative symlinks when possible because they stay valid even when my filesystem is mounted in a non-root location, for example if I am accessing it remotely.
However, if I move a directory which contains relative symlinks, in general those links become invalid.
I am looking for a command that I can use to move a whole directory (tree), rewriting only those relative symlinks that point outside the directory so that they still point to the same files.
There is a related question on Stack Overflow, How do I move a relative symbolic link?. Also, here on Unix & Linux, find all symbolic links in a directory tree pointing outside that tree, and (referring to a much harder problem) is there some kind of symbolic links that support moving or renaming the target file?.
For example, a command called mv-rel
which behaves as follows (the other commands being their GNU coreutils versions):
$ mkdir foo
$ touch bar
$ ln -sr bar foo/
$ touch foo/flob
$ ln -sr foo/flob foo/qux
$ ls -gG foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
$ mkdir baz
$ mv-rel foo/ baz
$ ls -gG baz/foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
Unless I'm missing something, this also seems like it would be a useful command-line option to the 'mv' command (maybe also 'cp'). But for the purposes of this question I am looking for something that exists now, or a simple portable script that implements this functionality.
shell symlink directory-structure coreutils
Check if rsync has a symlink handling option that works for you.
– Gilles
Dec 1 at 9:42
Not seeing it...
– Metamorphic
Dec 1 at 12:42
Have you tried a gui file manager or does it have to be a command?
– rhubarbdog
Dec 3 at 2:47
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I like to use relative symlinks when possible because they stay valid even when my filesystem is mounted in a non-root location, for example if I am accessing it remotely.
However, if I move a directory which contains relative symlinks, in general those links become invalid.
I am looking for a command that I can use to move a whole directory (tree), rewriting only those relative symlinks that point outside the directory so that they still point to the same files.
There is a related question on Stack Overflow, How do I move a relative symbolic link?. Also, here on Unix & Linux, find all symbolic links in a directory tree pointing outside that tree, and (referring to a much harder problem) is there some kind of symbolic links that support moving or renaming the target file?.
For example, a command called mv-rel
which behaves as follows (the other commands being their GNU coreutils versions):
$ mkdir foo
$ touch bar
$ ln -sr bar foo/
$ touch foo/flob
$ ln -sr foo/flob foo/qux
$ ls -gG foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
$ mkdir baz
$ mv-rel foo/ baz
$ ls -gG baz/foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
Unless I'm missing something, this also seems like it would be a useful command-line option to the 'mv' command (maybe also 'cp'). But for the purposes of this question I am looking for something that exists now, or a simple portable script that implements this functionality.
shell symlink directory-structure coreutils
I like to use relative symlinks when possible because they stay valid even when my filesystem is mounted in a non-root location, for example if I am accessing it remotely.
However, if I move a directory which contains relative symlinks, in general those links become invalid.
I am looking for a command that I can use to move a whole directory (tree), rewriting only those relative symlinks that point outside the directory so that they still point to the same files.
There is a related question on Stack Overflow, How do I move a relative symbolic link?. Also, here on Unix & Linux, find all symbolic links in a directory tree pointing outside that tree, and (referring to a much harder problem) is there some kind of symbolic links that support moving or renaming the target file?.
For example, a command called mv-rel
which behaves as follows (the other commands being their GNU coreutils versions):
$ mkdir foo
$ touch bar
$ ln -sr bar foo/
$ touch foo/flob
$ ln -sr foo/flob foo/qux
$ ls -gG foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
$ mkdir baz
$ mv-rel foo/ baz
$ ls -gG baz/foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
Unless I'm missing something, this also seems like it would be a useful command-line option to the 'mv' command (maybe also 'cp'). But for the purposes of this question I am looking for something that exists now, or a simple portable script that implements this functionality.
shell symlink directory-structure coreutils
shell symlink directory-structure coreutils
asked Dec 1 at 9:10
Metamorphic
25617
25617
Check if rsync has a symlink handling option that works for you.
– Gilles
Dec 1 at 9:42
Not seeing it...
– Metamorphic
Dec 1 at 12:42
Have you tried a gui file manager or does it have to be a command?
– rhubarbdog
Dec 3 at 2:47
add a comment |
Check if rsync has a symlink handling option that works for you.
– Gilles
Dec 1 at 9:42
Not seeing it...
– Metamorphic
Dec 1 at 12:42
Have you tried a gui file manager or does it have to be a command?
– rhubarbdog
Dec 3 at 2:47
Check if rsync has a symlink handling option that works for you.
– Gilles
Dec 1 at 9:42
Check if rsync has a symlink handling option that works for you.
– Gilles
Dec 1 at 9:42
Not seeing it...
– Metamorphic
Dec 1 at 12:42
Not seeing it...
– Metamorphic
Dec 1 at 12:42
Have you tried a gui file manager or does it have to be a command?
– rhubarbdog
Dec 3 at 2:47
Have you tried a gui file manager or does it have to be a command?
– rhubarbdog
Dec 3 at 2:47
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
Here's a fairly destructive method: replace the relative links with absolute links:
cd foo
for f in *; do
if [[ -h $f ]] # True if file is a symbolic link.
then
abs=$(readlink -f "$f") && rm "$f" && ln -s "$abs" "$f"
fi
done
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
Here's a fairly destructive method: replace the relative links with absolute links:
cd foo
for f in *; do
if [[ -h $f ]] # True if file is a symbolic link.
then
abs=$(readlink -f "$f") && rm "$f" && ln -s "$abs" "$f"
fi
done
add a comment |
up vote
0
down vote
Here's a fairly destructive method: replace the relative links with absolute links:
cd foo
for f in *; do
if [[ -h $f ]] # True if file is a symbolic link.
then
abs=$(readlink -f "$f") && rm "$f" && ln -s "$abs" "$f"
fi
done
add a comment |
up vote
0
down vote
up vote
0
down vote
Here's a fairly destructive method: replace the relative links with absolute links:
cd foo
for f in *; do
if [[ -h $f ]] # True if file is a symbolic link.
then
abs=$(readlink -f "$f") && rm "$f" && ln -s "$abs" "$f"
fi
done
Here's a fairly destructive method: replace the relative links with absolute links:
cd foo
for f in *; do
if [[ -h $f ]] # True if file is a symbolic link.
then
abs=$(readlink -f "$f") && rm "$f" && ln -s "$abs" "$f"
fi
done
answered Dec 3 at 16:21
glenn jackman
49.7k569106
49.7k569106
add a comment |
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f485320%2fwhat-is-a-good-command-for-moving-a-directory-containing-relative-symbolic-links%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Check if rsync has a symlink handling option that works for you.
– Gilles
Dec 1 at 9:42
Not seeing it...
– Metamorphic
Dec 1 at 12:42
Have you tried a gui file manager or does it have to be a command?
– rhubarbdog
Dec 3 at 2:47