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.

  • linuxPIPEpower@discuss.tchncs.deOP
    link
    fedilink
    arrow-up
    1
    ·
    3 days ago

    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
      link
      fedilink
      English
      arrow-up
      1
      ·
      3 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"