How do I create a soft link to all executables in a different directory?

3

1

I am trying to create soft links to mingw's binaries in cygwin.

So far I have: find /cygdrive/c/MinGW/bin/ -name "*.exe" -exec ln -s {} basename {} \;

but I get:

ln: target `/cygdrive/c/MinGW/bin/addr2line.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/ar.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/as.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/c++.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/c++filt.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/cc.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/cpp.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/dlltool.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/dllwrap.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/elfedit.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/envsubst.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/g++.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/gcc.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/gcov.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/gdb.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/gdbserver.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/gettext.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/gprof.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/iconv.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/ld.bfd.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/ld.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/mingw-get.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/mingw32-c++.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/mingw32-cc.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/mingw32-g++-4.6.2.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/mingw32-g++.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/mingw32-gcc-4.6.2.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/mingw32-gcc.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/mingw32-make.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgattrib.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgcat.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgcmp.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgcomm.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgconv.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgen.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgexec.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgfilter.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgfmt.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msggrep.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msginit.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgmerge.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msgunfmt.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/msguniq.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/ngettext.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/nm.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/objcopy.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/objdump.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/pkginfo.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/quserex-test.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/ranlib.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/readelf.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/recode-sr-latin.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/size.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/strings.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/strip.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/windmc.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/windres.exe' is not a directory
ln: target `/cygdrive/c/MinGW/bin/xgettext.exe' is not a directory

chacham15

Posted 2012-07-16T22:43:00.843

Reputation: 566

Answers

4

Since ln accepts directories as targets:

ln -s /cygdrive/c/MinGW/bin/*.exe /path/to/otherdirectory/

user1686

Posted 2012-07-16T22:43:00.843

Reputation: 283 655

3

To make your command work I don't think you can avoid sub-shelling, something like:

find /cygdrive/c/MinGW/bin/ -name "*.exe" -print0 | xargs -0 -n1 bash -c 'ln -s {} $(basename {})'

If all the files are in the same directory, you can also use cp -s:

cp -s /cygdrive/c/MinGW/bin/* .

Thor

Posted 2012-07-16T22:43:00.843

Reputation: 5 178

2

for i in /source/directory/*.exe; do
    ln -s $i /destination/directory/`basename $i`
done

Michael Hampton

Posted 2012-07-16T22:43:00.843

Reputation: 11 744

thats cool, but for the sake of completeness, is there a way to correct what i had above? – chacham15 – 2012-07-16T22:52:05.793

If there is, I don't know it. I avoid find whenever possible. :) – Michael Hampton – 2012-07-16T22:52:38.897