hardlink для директории, find ln exec [РеШеНо]

Добрый день.

Хочу делать hardlink на директорию с множеством вложенных каталогов.

РЕШЕНО - Уважаемые форумчане подсказали куда смотреть в мануалах.
cp -rl копирует структуру каталога и создает hardlink вместо файлов. rsync имеет сходный функционал.




Rsnapshot по ряду причин не подходит.




Лобовое ln -d TARGET_DIR LINK_NAME не работает.
Придумалось делать копию directiry tree

rsync.exe -av -f“+ */” -f“- *” /source /destination

потом получать абсолютные пути к всем файлам и делать линки

find /source -type f
каким то образом изменять в полученном пути source на destination и делать ln
писать отдельную “продцедуру” по подмене - не изящно, чтоли.

очень понравилась мысль про -exec
find /source -type f -name * -exec ln {} –target-directory=/destination \;
но в этом случае все линки складываются в /destination без соблюдения вложенных директорий.

можно ли задачу по созданию hardlink файлов с вложенными каталогами решить силами find или придется получать список путей, делать новый список и пропускать через цикл ln, подставляя сформированные пути в новом каталоге?
Жесткие ссылки на каталоги запрещены, никакие обычные утилиты создать их вам не позволят.
Однако, вместо этого вы можете использовать монтирование каталога в каталог :)
man mount
The bind mounts.
       Since  Linux  2.4.0  it is possible to remount part of the file hierarchy somewhere
       else. The call is
              mount --bind olddir newdir
       or shortoption
              mount -B olddir newdir
       or fstab entry is:
              /olddir /newdir none bind
не понимаю, что монтирование мне может дать

мне нужно иметь именно hardlink к файлам со всеми вытекающими.
например есть папка 1, где лежат 2 файла и папка 2, где лежат 2 хардлинка на файлы из папки 1

файл из каталога 1 удаляется, но есть хардлинк в папке 2.
файл из каталога 1 изменяется, изменяется “файл” в папке 2
Тогда объясните толком, чего хотите :)
При замене файла, на который есть хардлинк, вы получите ДВА файла – один старый по другому адресу, и один новый там, где заменяли. Если вам нужен именно этот эффект – вам остаётся создавать хардлинки на каждый файл, или собирать ядро с aufs/unionfs.

Впрочем, это не гарантирует, что файлов будет два – если файл не будет заменён, а вместо этого будет перезаписан – он изменится везде.

Если же вам как раз нужно, чтобы при замене файл заменялся везде, то подойдёт именно монтирование, которое будет иметь тот же эффект, что и хардлинк на каталог.
Natrio
Тогда объясните толком, чего хотите :)

в целом мне нужна кроссплатформенная (cygwin) консольная time machine )

*вы получите ДВА файла – один старый по другому адресу, и один новый там, где заменяли. Если вам нужен именно этот эффект – вам остаётся создавать хардлинки на каждый файл* - именно это.
ядро модифицировать нет возможности.

хардлинки на каждый файл - вот что меня останавливает.

пока только и есть в мыслях - получать полные пути до файлов
подменять в них sorce folder на destination folder и делать ln на каждый файл. кириллица и пробелы в названии файлов - привет (
find /source -type f -exec ln {} `здесь надо как то превратить sorce folder в destination folder внутри пути {}` \;

вроде даже получилось, в каталоге bbbb создать ссылки на файлы из каталога aaaa (при условии что в каталоге bbbb есть копия directory tree из aaaa)

find aaaa/ -type f -exec sh -c 'ln {} `echo {} | sed -e 's/aaaa/bbbb/g'`' \;
[shka@s12 tmp]$ stat bbbb/12/1111/112.txt 
  File: ‘bbbb/12/1111/112.txt’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 804h/2052d	Inode: 2628400     Links: 2
Access: (0644/-rw-r--r--)  Uid: ( 1000/    shka)   Gid: (  100/   users)
Access: 2012-09-02 17:59:51.487718929 +0400
Modify: 2012-09-02 17:59:51.487718929 +0400
Change: 2012-09-02 18:03:53.643073728 +0400
 Birth: -

ЗЫ осталось порешать кириллицу и пробелы в файлах

ЗЫЫ, кириллица в файлах работает нормально. но вот пробелы ни хотят

ЗЫЫЫ
ага, c пробелами в именах работает вот так

find aaaa/ -type f | while read i; do ln "$i" "`echo $i | sed -e 's/aaaa/bbbb/g'`"; done
Опция "-l" команды cp как раз вместо обычного копирования делает хардлинки. Присмотритесь к ней. В сочетании с опцией “-r” просто обсоздавайтесь этих хардлинков.
В rsync тоже есть такой функционал.
UPD: Здесь варианты велосипедов.
про рсинс да, подтвержу, но показалось что ТС хочеть свой велик сделать. Я думаю дать переменных в скрипте и тоже можно без столпотворения обойтись при “выделении имен”, ну или сократить немного.
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
cp -l - то что нужно! спасибо kurych
не надо никаких велосипедов ))
ведет себя также, т.е. создает диры а файлы хардлинкает?
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
stat уверяет что cp -rl делает все как надо.
копирует директории и создает hardlink на файлы.
это просто восхитительно )
 
Зарегистрироваться или войдите чтобы оставить сообщение.