Le 23 août 2013 20:40, "Bastien ROUCARIES" <roucaries.bast...@gmail.com> a écrit : > > Le 21 août 2013 08:04, "Raphael Hertzog" <hert...@debian.org> a écrit : > > > > > Hi, > > > > On Tue, 20 Aug 2013, Bastien ROUCARIES wrote: > > > > A possible way to do this could be: > > > > * Move the directory away in preinst (<dir>.dpkg-backup), put in place a symlink > > > > pointing to the renamed directory > > > ok this is easy > > > > * In postinst, move remaining files from the temporary directory to > > > > the directory pointed by the symlink (except if there's already a new > > > > file at the expected location, in that case warn about the conflict > > > > and leave the file). > > > > > > How can I do this ? mv -n is not portable, and if I use find how to > > > handle symlink ? > > > > mymove() { > > local origin=$1 > > local target=$2 > > while read path; do > > # do the work for each file here > > done > > } > Not safe if a filename include a new line... > > Find -print0 > > And replacing read by read -r -d $'\0' is safer but I do not know if it is portable. > > Or xargs but we need to fork for each file and we get the portability problem of find print0. > > What do you prefer ?
For find it is not a problem: Find - exec printf %s\0 + And I could test for portability problem of + if needed. And for read I could use in case of problem dd in order to read byte by byte. Bastien > > > find $origin | mymove $origin $target > > > > You can use compute the relative path names by stripping $origin from the > > stard and you can do whatever checks you want with "test". > > > > > Should I check if md5sum are the same in case of conflicts and > > > override in this case ? > > > > I would not override but it's interesting to compare the files > > yes. That way we can avoid complaining about a conflict when in fact > > both files are identical. And we can silently drop our copy. > > > > Cheers, > > -- > > Raphaël Hertzog ◈ Debian Developer > > > > Discover the Debian Administrator's Handbook: > > → http://debian-handbook.info/get/