在保留子文件夹树

时间:2016-04-02 22:03:47

标签: shell debian sh symlink ln

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

|/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

提前致谢。

2 个答案:

答案 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