HELP on checking for directory or symbolic link


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting HELP on checking for directory or symbolic link
# 1  
Old 08-31-2012
HELP on checking for directory or symbolic link

Hi,

Can anyone please advise why the following is not working as I expected it to be?

Test script as below:

Code:
#!/bin/ksh

for checkdir in dir*
do
   echo "Checking ${checkdir}"

   if [ -d "${checkdir}" ] ; then
      echo "... ${checkdir} is a directory"
   elif [ -h "${checkdir}" ; then
      echo "... ${checkdir} is a symbolic link"
   fi
done

Output from sample run as below:

Code:
$: ./x.ksh

Checking dir1
... dir1 is a directory
Checking dir2
... dir2 is a directory
Checking dir3
... dir3 is a directory

Directory listing as below:

Code:
$: ls -l
total 24
drwxr-x--x   2 oracle   dba         4096 Aug 31 23:42 dir1
drwxr-x--x   2 oracle   dba         4096 Aug 31 23:42 dir2
lrwxrwxrwx   1 oracle   dba            4 Aug 31 23:43 dir3 -> /tmp
-rwxr-----   1 oracle   dba          239 Aug 31 23:45 x.ksh

Am kinda hoping that it will report dir3 as a symbolic link. At the moment, only workaround I can think of is to do ls -l ${checkdir} | grep "^l" and if it is non-zero then it is a symbolic link, otherwise it is not. Is this the solution?

I've also tried doing -L instead of -h and it gives the same result.

Feedback and advise much appreciated. Thanks in advance.
# 2  
Old 08-31-2012
You could just test for a link first.
# 3  
Old 08-31-2012
You have missed ] in the code....Smilie

Quote:
Originally Posted by newbie_01
Hi,

Can anyone please advise why the following is not working as I expected it to be?

Test script as below:

Code:
#!/bin/ksh

for checkdir in dir*
do
   echo "Checking ${checkdir}"

   if [[ -d "${checkdir}" ]]; then
      echo "... ${checkdir} is a directory"
   elif [[ -h "${checkdir}" ]]; then
      echo "... ${checkdir} is a symbolic link"
   fi
done

Output from sample run as below:

# 4  
Old 08-31-2012
Hi pamu,

Just tried and got the same result.

Code:
/tmp$: cat x.ksh
#!/bin/ksh

for checkdir in dir*
do
   echo "Checking ${checkdir}"

   if [[ -d "${checkdir}" ]] ; then
      echo "... ${checkdir} is a directory"
   elif [[ -h "${checkdir}" ]] ; then
      echo "... ${checkdir} is a symbolic link"
   fi
done
/tmp$: ls -ltrd dir*
drwxr-x--x   2 oracle   dba         4096 Aug 31 23:42 dir1
drwxr-x--x   2 oracle   dba         4096 Aug 31 23:42 dir2
lrwxrwxrwx   1 oracle   dba            4 Aug 31 23:43 dir3 -> /tmp
/tmp$: ./x.ksh
Checking dir1
... dir1 is a directory
Checking dir2
... dir2 is a directory
Checking dir3
... dir3 is a directory
/tmp$:

Also tried CarloM's suggestion and same problem.

---------- Post updated at 04:38 PM ---------- Previous update was at 04:27 PM ----------

Quote:
Originally Posted by CarloM
You could just test for a link first.
Hi CarloM,

Tried your suggestion, unfortunately, now it goes like below:

Code:
tmp $: ls -ltrd dir*
drwxr-x--x   2 oracle   dba         4096 Aug 31 23:42 dir1
drwxr-x--x   2 oracle   dba         4096 Aug 31 23:42 dir2
lrwxrwxrwx   1 oracle   dba            4 Aug 31 23:43 dir3 -> /tmp
tmp $: cat y.ksh
#!/bin/ksh

for checkdir in dir*
do
   echo "Checking ${checkdir}"

   if [[ -h "${checkdir}" ]] ; then
      echo "... ${checkdir} is a directory"
   elif [[ -d "${checkdir}" ]] ; then
      echo "... ${checkdir} is a symbolic link"
   fi
done
tmp $: cat z.ksh
#!/bin/ksh

for checkdir in dir*
do
   echo "Checking ${checkdir}"

   if [[ -L "${checkdir}" ]] ; then
      echo "... ${checkdir} is a directory"
   elif [[ -d "${checkdir}" ]] ; then
      echo "... ${checkdir} is a symbolic link"
   fi
done
tmp $: ./y.ksh
Checking dir1
... dir1 is a symbolic link
Checking dir2
... dir2 is a symbolic link
Checking dir3
... dir3 is a directory
tmp $: ./z.ksh
Checking dir1
... dir1 is a symbolic link
Checking dir2
... dir2 is a symbolic link
Checking dir3
... dir3 is a directory
tmp $:

# 5  
Old 08-31-2012
Quote:
tmp $: cat y.ksh
#!/bin/ksh

for checkdir in dir*
do
echo "Checking ${checkdir}"

if [[ -h "${checkdir}" ]] ; then
echo "... ${checkdir} is a directory"
elif [[ -d "${checkdir}" ]] ; then
echo "... ${checkdir} is a symbolic link"
fi
done
Nearly there but the echo statements do not match the tests. The Conditional Expression syntax "[[ .....]]" is not needed.

Code:
#!/bin/ksh

for checkdir in dir*
do
   echo "Checking ${checkdir}"

   if [ -h "${checkdir}" ] ; then
      echo "... ${checkdir} is a symbolic link"
   elif [ -d "${checkdir}" ] ; then
      echo "... ${checkdir} is a directory"
   fi
done


Last edited by methyl; 08-31-2012 at 08:30 PM.. Reason: layout and code tag errors
This User Gave Thanks to methyl For This Post:
# 6  
Old 08-31-2012
Quote:
The Conditional Expression syntax "[[ .....]]" is not needed.
Agreed, but it is useful. With it you do not have to explicitly quote the checkdir variable as quotes are implicitly added.
Code:
if [[ -h ${checkdir} ]] ; then
      echo "... ${checkdir} is a symbolic link"
elif [[ -d ${checkdir} ]] ; then
      echo "... ${checkdir} is a directory"
fi

# 7  
Old 08-31-2012
Quote:
Originally Posted by methyl
Nearly there but the echo statements do not match the tests. The Conditional Expression syntax "[[ .....]]" is not needed.

Code:
#!/bin/ksh

for checkdir in dir*
do
   echo "Checking ${checkdir}"

   if [ -h "${checkdir}" ] ; then
      echo "... ${checkdir} is a symbolic link"
   elif [ -d "${checkdir}" ] ; then
      echo "... ${checkdir} is a directory"
   fi
done


Thanks a lot methyl, that is so very embarrassing SmilieSmilie ....

All good now ... still stumped on why the -d returns true for a symbolic link though, it's like it is trying to check whether the link that the symlink is set to is a directory.

I can live with doing the -h then the -d for the time being ... thanks again for pointing out my mistakes ... need to grab some more coffee I guess

Below is an example where I create another symbolic link but the actual directory /tmp/x does not exist and my original script works like how I want it to. Any chance that there is a test where it will not try and resolve what the symbolic link is linking to?

Code:
tmp $: ./x.ksh
Checking dir1
... dir1 is a directory
Checking dir2
... dir2 is a directory
Checking dir3
... dir3 is a directory
Checking dir4
... dir4 is a symbolic link
tmp $: cat x.ksh
#!/bin/ksh

for checkdir in dir*
do
   echo "Checking ${checkdir}"

   if [[ -d "${checkdir}" ]] ; then
      echo "... ${checkdir} is a directory"
   elif [[ -h "${checkdir}" ]] ; then
      echo "... ${checkdir} is a symbolic link"
   fi
done
tmp $: ls -ltrd /tmp
drwxrwxrwt  79 root     root      221472 Sep  1 12:41 /tmp
tmp $: ls -ltrd /tmp/x
/tmp/x: No such file or directory
tmp $:


Last edited by newbie_01; 08-31-2012 at 09:45 PM.. Reason: More info
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Symbolic link

Hi, trying to understand more about symblic link, when I compiled a program called "match" in one folder ~/downloadsoftware/I want this program to be accessible like a system command by putting a symbolic link in /usr/bin/ Not by setting the $PATH method in .bashrc at this time. What I did is:... (4 Replies)
Discussion started by: yifangt
4 Replies

2. UNIX for Dummies Questions & Answers

[Solved] Symbolic link not allowed or link target not accessible

Hi everybody, I read about treads realted to this issue but they did not resovle issue given below. Please help me resolve issue given below I have html file under /srv/www/htdocs/actual_folder ls actual_folder/ test.html and following link works... (0 Replies)
Discussion started by: newbielgn
0 Replies

3. Shell Programming and Scripting

ls on a symbolic link

Hi all, Can anyone please confirm if the command below is the only way that I can get what the symbolic link is set to? mnlxd110(oracle)/db/posd2/dba$: ls -l | grep "^l" lrwxrwxrwx 1 oracle dba 28 Aug 9 2011 bdump -> diag/rdbms/posp1/posp1/trace mnlxd110(oracle)/db/posd2/dba$:... (7 Replies)
Discussion started by: newbie_01
7 Replies

4. UNIX for Dummies Questions & Answers

Symbolic link for an existing directory

Hi , i am trying to make a symbolic link for an existing directory, but i am facng some problems regarding the usage of command. If there is no directory i can make a symbolic link, but for an existing directory i am not able to. can anyone post me the exact usage if we already have the... (1 Reply)
Discussion started by: sahasra
1 Replies

5. Shell Programming and Scripting

Symbolic Link Help

Hello All, This may be a silly question to some but I am really stuck. Is there a way to reverse the following; sudo rm /bin/sh sudo ln -s /bin/bash /bin/sh It was part of a driver compile/installation procedure by Digi for Ubuntu stating that dash isn't supported and a symbolic link... (2 Replies)
Discussion started by: LAVco
2 Replies

6. Shell Programming and Scripting

symbolic link

Hi, i am trying to create sym links on sles 11 , but it seems i am doing something wrong. oracle@tests:/u01/app/oracle/oradata/ACIS> pwd /u01/app/oracle/oradata/ACIS oracle@tests:/u01/app/oracle/oradata/ACIS> ln -s /db/ACIS/dbase/dbf/ /u01/app/oracle/oradata/ACIS/... (2 Replies)
Discussion started by: tonijel
2 Replies

7. UNIX for Advanced & Expert Users

Any risk in chging /etc/conf/pack.d directory symbolic link?

We are migrating off an unsupported Stratus Continuum Model 418 PA-RISC running FTX 3.3.0. We're trying to hang on as long as possible, but we're down to 2.8% free in /, so need to free up some space until we're ready to migrate our DB. Currently /etc/conf/pack.d is symbolically linked to... (0 Replies)
Discussion started by: kgert
0 Replies

8. Solaris

How to copy a symbolic link

Hi I am trying to find a copy command that will copy a symbolic link itself and not what the link is actually pointing to. I am trying to copy a directory that has some symbolic links within it in IBM AIX unix this is achieved using cp -prh <source dir> <target> the 'h' flag is a hard copy... (3 Replies)
Discussion started by: jimthompson
3 Replies

9. UNIX for Dummies Questions & Answers

need some info about symbolic link and hard link

hello folks how y'all doin well i have some questions about symbolic link and hard link hope some one answer me i open terminal and join as root and i wrote ln -s blah blah then i wrote ls i see red file called blah blah but didn't understand what is this can some one explain and... (2 Replies)
Discussion started by: detective linux
2 Replies

10. UNIX for Dummies Questions & Answers

symbolic Link

question abt symbolic link ... i'm doing the following ... ln -s x.sh ./scripts/y.sh and cat ./scripts/y.sh it is giving following error cat: cannot open y.sh Any reason u an think of ? But it is working fine when i goto scripts directory and cretae the symbolic link. ... (1 Reply)
Discussion started by: bhargav
1 Replies
Login or Register to Ask a Question