I want to move a directory with a bunch of subdirectories and files. But I have the feeling there might be some symlinks to a few of them elsewhere on the file system. (As in the directory contains the targets of symlinks.)
How do I search all files for symlinks pointing to them?
Some combination of find
, stat
, ls
, realpath
, readlink
and maybe xargs
? I can’t quite figure it out.
I think it’s easier the other way round, find all symlinks and grep the directory you want to move from results.
Something like ‘find /home/user -type -l -exec ls -l {} ; | grep yourdirectory’ and work from there. I don’t think there’s an easy way to list which symlinks point to any actual file.
You want++OK, actually not exactly.readlink -f
rather thanls -l
.readlink
won’t print path to the symlink so it’s not as straightforward.++Also, you want
+
infind ... -exec ... +
rather than;
.At this point I feel committed to making readlink work. ;) Here’s the script you want:
#!/bin/sh want=$1 shift readlink -f -- "$@" | while read got; do if [ "$got" = "$want" ]; then echo "$1" fi shift done
and execute it as:
find ~ -type l -exec /bin/sh /path/to/the/script /path/to/target/dir {} +
because
zsh
I swapped out~
->$HOME
. In addition to some permission denied that you always getfind
ing over the home dir, I get these weird hits:find "$HOME" -type l -exec /bin/sh /path/to/the/script "/path/to/target/dir" {} + /home/user/.konan/dependencies/x86_64-unknown-linux-gnu-gcc-8.3.0-glibc-2.19-kernel-4.9-2/x86_64-unknown-linux-gnu/lib64/libatomic.so /home/user/.mozilla/firefox/xxx000xx.someprofile/chrome/dir/file.css
lib atomic is something I’ve heard of vaguely but certainly not anything I use. I couldn’t identify any way this file was doing anything outside the
~/.konan
dir.the CSS files there were a few different ones in a couple different Firefox profiles. it’s the user customization. But I don’t think it should have anything to do with the directory I was asking for.
If I give it a bit more of a hint, telling to look in
~/.config
specifically, now I get some (but not all) the links I expect.find "$HOME/.config" -type l -exec /bin/sh /path/to/the/script "/path/to/target/dir" {} + /home/user/.config/dir02 /home/user/.config/dir01/subdir/file /home/user/.config/dir01/subdir2/file2
And suggesting it searches in the
.konan
dir where it found lib atomimc, it now doesn’t find anything.find "$HOME/.konan" -type l -exec /bin/sh /path/to/the/script "/path/to/target/dir" {} +
Could be all kinds of things getting the way. Different versions of relevant tools, filesystems/setups, permissions…
You could pass
$1
and$got
through$(realpath -P -- ...)
to make sure all the path are in canonical form. Though now that I’m thinking about it,stat
is probably a better option anyway: