2011-02-01 95 views
2

我有一个目录,/original,有数百个文件。我有一个脚本会一次处理一个文件,并删除该文件,以便在脚本被中断时不会再执行。所以,我需要一些到/original/processing上的文件的软链接。下面是我的尝试:如何为目录中的每个文件创建软链接?

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

,并得到类似:

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

我想是这样的:

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

看来,$(basename)运行{}转换之前。有没有办法解决这个问题?如果不是,我还能如何实现我的目标?

+0

`basename`只运行一次;看到一个解释http://stackoverflow.com/questions/4793892/recursively-rename-files-using-find-and-sed/4794313#4794313 – 2011-02-01 15:43:38

回答

2

怎么样 -

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

它的工作原理,但它可能溢出,因为我得到更多的文件。 – User1 2011-02-01 15:51:28

5

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

特别感谢瑞安奥贝罗伊帮助我意识到,我可以使用的.代替$(basename ...)

+0

应该是`'* .processme'`(单引号),以便您不会匹配当前目录中剩下的任何文件。 – mark4o 2011-02-01 15:58:46

+0

好抓。我改变了它。 – User1 2011-02-01 16:28:42

6

您也可以使用cp(具体为-s选项,它创建符号链接),例如。

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

你只需要去除回声和剥离文件路径的重复和基本名称完全

如果源文件夹是这个

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年前开始的,对于那些寻求像我自己一样的解决方案的人来说,在我解决问题之前,

相关问题