How to create soft links for each file in a directory?

I have a directory /originalthat contains hundreds of files. I have a script that will process files one at a time and delete the file so that it does not run again if the script is interrupted. So, I need a bunch of soft file links from /originalto /processing. Here is what I tried:

find / original -name "* .processme" -exec echo ln -s {} $ (basename {}) \;

and got something like:

ln -s /original/1.processme /original/1.processme
ln -s /original/2.processme /original/2.processme
ln -s /original/3.processme /original/3.processme
...

I wanted something like:

ln -s /original/1.processme 1.processme
ln -s /original/2.processme 2.processme
ln -s /original/3.processme 3.processme
...

It seems to $(basename)work before the conversion {}. Is there any way to fix this? If not, how else can I achieve my goal?

+3
source share
5 answers

You can also use cp(in particular, a parameter -sthat creates symbolic links), for example.

find /original -name "*.processme" -print0 | xargs -0 cp -s --target-directory=.
+7
source

find /original -name '*.processme' -exec echo ln -s {} . \;

Special thanks to Ryan Oberoi for helping with what I can use .instead $(basename ...).

+5
source

-

ln -s $(echo /original/*.processme) .
+2

:

find /original -name "*.processme" -exec sh -c 'echo ln -s "$@" $(basename "$@")' _ {} \;
+1

-

ls -l /original
total 3
-rw-r--r-- 1 user user   345 Dec 17 21:17 1.processme
-rw-r--r-- 1 user user   345 Dec 17 21:17 2.processme
-rw-r--r-- 1 user user   345 Dec 17 21:17 3.processme

cd /processing
find /original -name "*.processme" -exec ln -s '{}' \;

ls -l /processing
total 3
lrwxrwxrwx 1 user user 33 Dec 17 21:38 1.processme -> /original/1.processme
lrwxrwxrwx 1 user user 33 Dec 17 21:38 2.processme -> /original/2.processme
lrwxrwxrwx 1 user user 33 Dec 17 21:38 3.processme -> /original/3.processme

, OP - 5 , , , , .

0
source

Source: https://habr.com/ru/post/1789262/


All Articles