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.

  • bizdelnick@lemmy.ml
    link
    fedilink
    arrow-up
    11
    ·
    edit-2
    2 days ago

    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.

  • IsoKiero@sopuli.xyz
    link
    fedilink
    English
    arrow-up
    8
    arrow-down
    1
    ·
    3 days ago

    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
      link
      fedilink
      arrow-up
      5
      arrow-down
      1
      ·
      edit-2
      3 days ago

      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.deOP
        link
        fedilink
        arrow-up
        1
        ·
        2 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
          ·
          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"
          
  • catloaf@lemm.ee
    link
    fedilink
    English
    arrow-up
    2
    ·
    2 days ago

    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.