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.
find / -lname '/path/you/are/looking/for/*'Note that the
-lnameoption is a GNUfindextension and may not work with otherfindimplementations.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 -frather thanls -l.readlinkwon’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 doneand execute it as:
find ~ -type l -exec /bin/sh /path/to/the/script /path/to/target/dir {} +because
zshI swapped out~->$HOME. In addition to some permission denied that you always getfinding 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.csslib 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
~/.konandir.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
~/.configspecifically, 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/file2And suggesting it searches in the
.konandir 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
$1and$gotthrough$(realpath -P -- ...)to make sure all the path are in canonical form. Though now that I’m thinking about it,statis probably a better option anyway:want=/path/to/target/dir pattern=$(stat -c^%d:%i: -- "$want") find "$HOME" -type l -exec stat -Lc%d:%i:%n {} + | grep "$pattern"
You could just move the dir and leave a symlink in its place. It doesn’t solve the actual problem, but it’s much easier and will keep everything working just fine.
If you just rename the dir, and then find all broken symlinks in your system?
find . -xtype l


