Shell 在保留子文件夹树的同时创建符号链接

Shell 在保留子文件夹树的同时创建符号链接,shell,debian,sh,symlink,ln,Shell,Debian,Sh,Symlink,Ln,假设我有以下目录层次结构 |/home | |/john | | |/app | | | |/folder1 | | | | |/data1.dat | | | | |/... | | | |/folder2 | | | | |/... | | | |/cfg | | |

假设我有以下目录层次结构

|/home
|     |/john
|     |     |/app
|     |     |    |/folder1
|     |     |    |        |/data1.dat
|     |     |    |        |/...
|     |     |    |/folder2
|     |     |    |        |/...
|     |     |    |/cfg    
|     |     |    |        |/settings.cfg
|     |     |    |        |/...
|     |     |    |/start.sh
|     |/deer                             <-- I'm here
|     |     |/app

提前感谢。

我以“黑客”的方式通过更改工作目录和使用
find
检索相对路径,实现了我想要的,以下是我所做的

# Some variables
basedir="/home/john"
currentdir=$(pwd)

# Duplicate directory tree
rsync -a -f"+ */" -f"- *" ${basedir}/app/ app/

# Create links
(cd ${basedir}; find * -type f -path "app/*" -not -path "*/cfg*" -exec ln -s ${basedir}/'{}' ${currentdir}/'{}' \;)
括号用于取消
cd


尽管如此,我还是欢迎任何更漂亮的解决方案。

我通过改变工作目录和使用
find
检索相对路径,以一种“黑客”的方式实现了我想要的,以下是我所做的

# Some variables
basedir="/home/john"
currentdir=$(pwd)

# Duplicate directory tree
rsync -a -f"+ */" -f"- *" ${basedir}/app/ app/

# Create links
(cd ${basedir}; find * -type f -path "app/*" -not -path "*/cfg*" -exec ln -s ${basedir}/'{}' ${currentdir}/'{}' \;)
括号用于取消
cd

尽管如此,我还是欢迎任何更漂亮的解决方案。

之前(OP中规范的特别副本):

代码,没有rsync,具有man ln所称的ln语法“ln TARGET”的“第二种形式”(在当前目录中创建指向TARGET的链接);(也ln*-sr用于相对符号链接):

…之后:

% tree /home/
/home/
├── deer
│   └── app
│       ├── folder1 -> ../../john/app/folder1
│       ├── folder2 -> ../../john/app/folder2
│       └── start.h -> ../../john/app/start.h
└── john
    └── app
        ├── cfg
        │   └── settings.cfg
        ├── folder1
        │   └── data1.dat
        ├── folder2
        └── start.h

9 directories, 4 files
之前(OP中规范的特别副本):

代码,没有rsync,具有man ln所称的ln语法“ln TARGET”的“第二种形式”(在当前目录中创建指向TARGET的链接);(也ln*-sr用于相对符号链接):

…之后:

% tree /home/
/home/
├── deer
│   └── app
│       ├── folder1 -> ../../john/app/folder1
│       ├── folder2 -> ../../john/app/folder2
│       └── start.h -> ../../john/app/start.h
└── john
    └── app
        ├── cfg
        │   └── settings.cfg
        ├── folder1
        │   └── data1.dat
        ├── folder2
        └── start.h

9 directories, 4 files

不需要链接“/home/john/app”下的每个文件。只需链接除“cfg”之外的每个目录和“/app”下的每个常规文件。这是一种简化,实际上,我想排除的第四个目录“addons”下还有一个目录“plugins”,因此我必须使用maxdepth逐级遍历层次结构,这让我更加困惑。啊,第二个排除,在一个细分市场中。。。我在发布了一个答案后读到了这篇文章,但答案并没有说明这一点。嗯……如果“app/addons/plugins”也被删除了,那么也要排除整个“addons”目录,如答案部分的代码所示。然后分别处理“插件”,使用相同的代码,进行适当修改。也许一个概括这个过程的脚本是最好的。没有必要链接“/home/john/app”下的每个文件。只需链接除“cfg”之外的每个目录和“/app”下的每个常规文件。这是一种简化,实际上,我想排除的第四个目录“addons”下还有一个目录“plugins”,因此我必须使用maxdepth逐级遍历层次结构,这让我更加困惑。啊,第二个排除,在一个细分市场中。。。我在发布了一个答案后读到了这篇文章,但答案并没有说明这一点。嗯……如果“app/addons/plugins”也被删除了,那么也要排除整个“addons”目录,如答案部分的代码所示。然后分别处理“插件”,使用相同的代码,进行适当修改。也许一个概括这个过程的脚本是最好的。
% tree /home/
/home/
├── deer
│   └── app
│       ├── folder1 -> ../../john/app/folder1
│       ├── folder2 -> ../../john/app/folder2
│       └── start.h -> ../../john/app/start.h
└── john
    └── app
        ├── cfg
        │   └── settings.cfg
        ├── folder1
        │   └── data1.dat
        ├── folder2
        └── start.h

9 directories, 4 files