12

I've got a source control system at work that I can't modify which scatters a bunch of files in unfortunate places. My IDE expects these folders to be in a single unified location. Normally I'd just symlink everything, but to make things worse, some of the folders must be recursively merged. I have a guarantee that there are no overlapping filenames, but we're talking about thousands of files, more than I'll do by hand.

I've looked into unionfs and aufs, but it's a corporate machine, so no mucking about with the kernel (not to mention the "getting started" docs for these wang chung).

Is there another way to do this?

Jeff Schaller
  • 67,283
  • 35
  • 116
  • 255
Hounshell
  • 303
  • Does your kernel have fuse enabled? It is enabled by default under Ubuntu. The point of FUSE is that everything happens in userland, there's no need to muck about with the kernel. Try unionfs-fuse (compile it from source if it isn't included in your release of Ubuntu). – Gilles 'SO- stop being evil' Jun 12 '12 at 22:46

1 Answers1

17

I don't know the tools you are using exactly and how they behave with symbolic links, but you can "copy" whole tree using symlinks (or hard links if you want) automatically using -s option of cp (or -l for hard links).


Let's have a look at below example.

.
├── 1
│   ├── s -> x
│   ├── x
│   ├── y
│   └── z
│       └── 1
└── 2
    ├── a
    │   └── 2
    ├── b
    └── c

If you want co symlink 1/ files to 2/ in current directory, then you can just simply do:

cp -ans "$PWD/1/"* 2/

Now 2/ looks like:

.
...
└── 2
    ├── a
    │   └── 2
    ├── b
    ├── c
    ├── s -> /home/przemoc/links/1/s
    ├── x -> /home/przemoc/links/1/x
    ├── y -> /home/przemoc/links/1/y
    └── z
        └── 1 -> /home/przemoc/links/1/z/1

Explanation of used cp options:

  • -a or --archive
    preserves attributes, links and copies directories recursively (it's in fact alias of -dR --preserve=all)
  • -n or --no-clobber
    prevents overwriting existing files
  • -s or --symbolic-link
    makes symbolic links instead of literal copying

Source file paths have to be absolute in such case (that's why I used $PWD), because cp "can make relative symbolic links only in current directory".

Rui F Ribeiro
  • 56,709
  • 26
  • 150
  • 232
przemoc
  • 456
  • cp -s is new to me, so thank you for that, but this seems to be a one-time operation. I'll need to do this repeatedly, every time I sync with the codebase or add a file. This also doesn't cover cases where the folders need to be merged. For example, if I had ./1/a/3, in my resulting folder I'd want to see ./2/a/[2,3], but I'm pretty sure this copy operation would clobber files. Does that make sense? – Hounshell Jun 12 '12 at 21:58
  • 1
    @Hounshell: You can do it repeatedly, but it won't work with future renames and such, it's simply a copy, only using symlinks. You can possibly go with hard links as long as "unfortunate places" are on the same filesystem. Your description is quite enigmatic, but to preserve some control I would make this unified location consisting only of links (symbolic or hard, whatever suits you better), so it could be easily cleaned and recreated with simple script using cp -ans from different places to your one "merged" directory. As for your question of folder merging, it will work fine, don't worry. – przemoc Jun 12 '12 at 22:17