Soft link/file name problem

I want to find graphic files on an external disk then create soft links to those files in a folder on my machine. I have a problem with file names: if there are two graphic files in different directories but with the same file name, a link is created only for the first file i.e the 2nd file is skipped. Any suggestion on how to overcome this greatly appreciated. Is there a way to give a new filename in the soft link for a file name that already exists?

imgdir=/home/stuff

find /mnt/disk -type f -a \
	\( -name '*.gif' \
	-o -name '*.GIF' \
	-o -name '*.jpg' \
	-o -name '*.JPG' \
	-o -name '*.jpeg' \
	-o -name '*.JPEG' \
	-o -name '*.png' \
	-o -name '*.PNG' \
	\) -exec ln -s {} $imgdir ';'

Thanks

Change the find command to call a script such as "makelink" which accepts two arguments, the origin path name and the destination dir.

Then, that script will handle the details, and looks something like this:

filepath=$1
file=${1##*/}   # works in ksh and bash. Otherwise use `basename $1`
dir=$2
while [ -f $dir/$file -o -L $dir/$file ]; do
   # TODO transform  $file here
done
ln -s $filepath $dir/$file

Now, I don't want to completely spoil it for you. How you do the TODO part isn't standard, but how you want to name your files. Do you want them to be numbered like in Window, or something like "file1.jpg" and "file2.jpg" or more exotic like "file0001.jpg" or maybe "file from vol1.jpg" ?

Thanks for the reply. I was thinking that the file name would stay the same but just increment by [1], [2] etc. So if 3 files called 10.jpg were found on the filesystem, they would be called 10.jpg, 10[1].jpg, 10[2].jpg in my directory containing all of the link files.

Can you clarify how I modify the find command, please? I guess I just change the final line to use the -exec scriptname option?

find command:

imgdir=/home/stuff

find /mnt/disk -type f -a \
	\( -name '*.gif' \
	-o -name '*.GIF' \
	-o -name '*.jpg' \
	-o -name '*.JPG' \
	-o -name '*.jpeg' \
	-o -name '*.JPEG' \
	-o -name '*.png' \
	-o -name '*.PNG' \
	\) -exec /usr/local/bin/makelink "{}" $imgdir ';'

The make the /usr/local/bin/makelink file as mentioned above. (If you don't have access permissions, create $HOME/bin and put it in there; change the find command appropriately.)

The missing part in the script should be something like this:

   file=`echo $file | perl -pe 's/(?<!\d\])\./[0]\./;s/\[(\d+)\]\./"[".($x=$1,++$x)."]."/e;'`

This will work for just about any number of files. Example:

echo test[99].jpg | perl -pe 's/(?<!\d\])\./[0]\./;s/\[(\d+)\]\./"[".($1+1)."]."/e;'
test[100].jpg

Perl does two substitutions (stuff between s/.../;). The first looks for a period NOT preceded by a digit that is followed by a right-bracket. If it finds such a string, it replaces it with [0]. The next looks for a number inside brackets and followed by a period. If it finds such a thing (which it will if the previous step succeeded, or as it must if the previous step failed) it replaces the number found with the next higher number (just adds 1).

The output is sent to the shell which stores that output in the variable "file". The next iteration of the while loop should fail, and then the ln command will do its thing.

Thanks squire! No amount of googling and book reading would have lead me to coming up with that solution any time soon.

Thanks again