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