2016-04-02 36 views
1

比方說,我有以下的目錄層次結構創建符號鏈接,同時保留子樹

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

我需要符號鏈接(空間原因)都在/ home/JOHN /應用程序中的文件排除下的文件/家/ 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

沒有必要鏈接*每*下一個 '/ home/JOHN /應用程序' 文件。只需鏈接每個目錄,但'cfg'和'./app'下的每個常規文件。 – agc

+0

這是一個簡化,實際上我有另一個dir'plugins'在名爲'addons'的第四個目錄下,我想排除它,所以要做到這一點,我必須用maxdepth逐級遍歷層次結構,更讓我感到困惑。 – Robotex

+0

啊,第二個排除,在一個子目錄中......我在發佈一個沒有解釋的答案後讀到這個。嗯...... – agc

回答

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效果

不過,我歡迎任何更漂亮的解決方案。

0

之前(一特設規範的副本在OP):

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

8 directories, 3 files 

代碼,沒有rsync的,具有什麼人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