假设我有以下目录层次结构
|/home
| |/john
| | |/app
| | | |/folder1
| | | | |/data1.dat
| | | | |/...
| | | |/folder2
| | | | |/...
| | | |/cfg
| | | | |/settings.cfg
| | | | |/...
| | | |/start.sh
| |/deer <-- I'm here
| | |/app
我需要符号链接(出于空间原因)/ home / john / app下的所有文件排除了/ home / john / app / cfg下的文件(它们是为每个用户自定义的)/ home / deer / app保留app文件夹中的子目录树。
我怎样才能做到这一点?我已经尝试使用rsync
(重新创建子文件夹树)和find
(列出没有cfg中的文件的文件)的组合,但是我很难告诉ln
创建正确子文件夹中的符号链接。
rsync -a -f"+ */" -f"- *" /home/john/app/ app/
find /home/john/app/* -type f -exec ln -s '{}' app/ \; # I'm stuck here
提前致谢。
答案 0 :(得分:0)
我成功地实现了我想要的“hackish&#39;通过更改工作目录并使用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
不过,我欢迎任何更漂亮的解决方案。
答案 1 :(得分:0)
之前(OP中规范的 ad hoc 副本):
% tree /home/
/home/
├── deer
│ └── app
└── john
└── app
├── cfg
│ └── settings.cfg
├── folder1
│ └── data1.dat
├── folder2
└── start.h
8 directories, 3 files
代码,没有 rsync ,其中包含 man ln 调用 ln 语法'ln TARGET'的“第二种形式”(创建一个链接到当前目录中的TARGET); (相对符号链接的 ln * -sr ):
cd /home/deer/app/
find /home/john/app/ -maxdepth 1 -not -path "*/cfg" -not -path "*/app/" -exec ln -sr '{}' \; ;
cd - > /dev/null
...后:
% 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