我有一个目录,
/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)
在 {}
转换之前正在运行。有办法解决这个问题吗?如果没有,我怎样才能实现我的目标?
您还可以使用
cp
(特别是 -s
选项,它创建符号链接),例如。
find /original -name "*.processme" -print0 | xargs -0 cp -s --target-directory=.
find /original -name '*.processme' -exec echo ln -s {} . \;
特别感谢 Ryan Oberoi 帮助我意识到我可以使用
.
代替 $(basename ...)
。
怎么样 -
ln -s $(echo /original/*.processme) .
尝试一下:
find /original -name "*.processme" -exec sh -c 'echo ln -s "$@" $(basename "$@")' _ {} \;
您只需删除回显并完全删除文件路径和基本名称的重复部分
如果您的源文件夹是这个
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年前的,我在解决这个问题之前为那些像我一样寻求相同解决方案的人发布了这篇文章。
ls /home/mindon/bin/* | xargs ln -s -t /usr/local/bin/