Shell – List direct symbolic links (links that don’t point to another symlink)

filesshellsolarissymlink

I need to make a list of all direct symbolic links in a directory, i.e. symbolic links that point to another file which is not a symbolic link.
I tried to do it this way:

for i in $(ls -1A); do

    first_type=$(ls -l $i | cut -b 1)

    if [ $first_type == 'l' ]
    then

        next=$(ls -l $i | awk '{print $NF}')
        next_type=$(ls -l $next | cut -b 1)

        if [ $next_type != 'l' ]
        then
            #Some code
        fi

    fi

done

But in this case, the script skips files whose names have spaces/tabs/newlines (including at the start and end of the file name).
Is there any way to solve this?

I working on Solaris 10. There is no readlink or stat command. The find command does not have -printf.

Best Answer

I can provide you with a perl snippet to do this for you:

#!/usr/bin/perl
#
foreach my $i (@ARGV) {
    # If it is a symlink then...
    -l $i and do {
        # First indirection; ensure that it exists and is not a link
        my $j = readlink($i);
        print "$i\n" if -e $j and ! -l $j
    }
}

If you save that as /usr/local/bin/if-link and make it executable (chmod a+x /usr/local/bin/if-link) you can use it like this

/usr/local/bin/if-link * .*

To incorporate it in another script, you can use it as a one-liner

perl -e 'foreach my $i (@ARGV) { -l $i && do { my $j = readlink($i); print "$i\n" if -e $j and ! -l $j } }' * .*
Related Question