【问题标题】:How to create soft-links for every file in a directory?如何为目录中的每个文件创建软链接?
【发布时间】:2011-06-19 08:47:46
【问题描述】:

我有一个目录/original,其中包含数百个文件。我有一个脚本,它将一次处理一个文件并删除该文件,因此如果脚本被中断,它就不会再次执行。所以,我需要一堆软链接到/original/processing 上的文件。这是我尝试过的:

查找 /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) 在转换{} 之前正在运行。有没有办法解决这个问题?如果没有,我还能如何达到我的目标?

【问题讨论】:

标签: linux bash find


【解决方案1】:

您还可以使用cp(特别是-s 选项,它会创建符号链接),例如。

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

【讨论】:

  • 这是目前最好的建议,因为使用 xargs 而不是 find 和 -exec 效果更好。
【解决方案2】:

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

特别感谢 Ryan Oberoi 帮助我意识到我可以使用 . 而不是 $(basename ...)

【讨论】:

  • 应该是'*.processme'(单引号),这样就不会匹配当前目录中剩余的任何文件。
【解决方案3】:

怎么样——

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

【讨论】:

    【解决方案4】:

    试试这个:

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

    【讨论】:

      【解决方案5】:

      您只需要删除 echo 并完全去除重复的文件路径和基本名称

      如果你的源文件夹是这样的

      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 年前的,我为那些在我解决之前寻求相同解决方案的人发布了这个。

      【讨论】:

        【解决方案6】:

        ls /home/mindon/bin/* | xargs ln -s -t /usr/local/bin/

        【讨论】:

          猜你喜欢
          • 2014-03-05
          • 1970-01-01
          • 1970-01-01
          • 2015-08-29
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多