2016-04-02 3 views
1

Скажем, у меня есть следующая иерархия каталоговСоздание символических ссылок при сохранении вложенных папок дерева

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

мне нужно симлинки (по космическим причинам) все файлы в/главная/джон/приложение без файлов в/главная/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 

Заранее спасибо.

+0

Там нет необходимости связывать * каждый * файл под '/ дом/сортир/приложения'. Просто связывайте каждый каталог, но 'cfg', и каждый обычный файл под './app'. – agc

+0

Это упрощение, на самом деле у меня есть еще один «плагины» dir под четвертым dir с именем «addons», который я хотел исключить, поэтому для этого мне пришлось бы пройти уровень иерархии по уровню с maxdepth, и это сделало его еще более запутанным для меня. – Robotex

+0

Ах, второе исключение, еще в subdir ... Я прочитал это после публикации ответа, который не учитывал этого. Hmm ... – agc

ответ

0

мне удалось добиться того, что я хотел в «хаком» способом, изменяя рабочий каталог и получения относительных путей с 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, показывая, что человек пер называет "2-форму" пер синтаксис 'ln TARGET' (создать ссылку на TARGET в текущем каталоге); (Также пер * -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