look for symlinks pointing at the contents of directory?
from linuxPIPEpower@discuss.tchncs.de to linux@lemmy.ml on 29 Mar 10:02
https://discuss.tchncs.de/post/33289992

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.

#linux

threaded - newest

IsoKiero@sopuli.xyz on 29 Mar 10:19 next collapse

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.

mina86@lemmy.wtf on 29 Mar 10:54 collapse

You want readlink -f rather than ls -l. ++OK, actually not exactly. readlink won’t print path to the symlink so it’s not as straightforward.++

Also, you want + in find … -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 {} +
linuxPIPEpower@discuss.tchncs.de on 29 Mar 13:19 collapse

because zsh I swapped out ~ -> $HOME. In addition to some permission denied that you always get finding 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…

mina86@lemmy.wtf on 29 Mar 17:15 collapse

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:

want=/path/to/target/dir
pattern=$(stat -c^%d:%i: -- "$want")
find "$HOME" -type l -exec stat -Lc%d:%i:%n {} + | grep "$pattern"
bizdelnick@lemmy.ml on 29 Mar 13:24 next collapse

find / -lname ‘/path/you/are/looking/for/*’

Note that the -lname option is a GNU find extension and may not work with other find implementations.

catloaf@lemm.ee on 29 Mar 14:38 next collapse

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.

Goingdown@sopuli.xyz on 29 Mar 14:55 collapse

If you just rename the dir, and then find all broken symlinks in your system?

find . -xtype l