this post was submitted on 29 Mar 2025
20 points (95.5% liked)

Linux

52665 readers
1500 users here now

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.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
 

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.

you are viewing a single comment's thread
view the rest of the comments
[–] mina86@lemmy.wtf 4 points 2 days ago* (last edited 2 days ago) (1 children)

~~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 1 points 2 days ago (1 children)

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 1 points 2 days ago

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"