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.
From Wikipedia, the free encyclopedia
Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).
Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.
Community icon by Alpár-Etele Méder, licensed under CC BY 3.0
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.
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 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 {} +
because zsh
I swapped out ~
-> $HOME
. In addition to some permission denied that you always get find
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:
want=/path/to/target/dir
pattern=$(stat -c^%d:%i: -- "$want")
find "$HOME" -type l -exec stat -Lc%d:%i:%n {} + | grep "$pattern"
If you just rename the dir, and then find all broken symlinks in your system?
find . -xtype l
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.