1

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

|/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 同时保留子目录应用程序文件夹中的树。

我怎样才能做到这一点?我已经尝试使用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

提前致谢。

4

2 回答 2

0

之前( OP 中规范的临时副本):

% 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
于 2016-04-03T13:55:26.103 回答
0

通过更改工作目录并使用 检索相对路径,我设法以“hackish”的方式实现了我想要的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

不过,我欢迎任何更漂亮的解决方案。

于 2016-04-03T09:51:32.497 回答