My dotfiles. Period.

mklinks 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/perl
  2. # ============================================
  3. # mklinks
  4. # --------------------------------------------
  5. #
  6. # usage: mklinks DOTROOT [PREFIX]
  7. #
  8. #
  9. # This script will go through each file or
  10. # sub-folder of DOTROOT and create symbolic
  11. # link to it under your HOME named with "."
  12. # prefix.
  13. #
  14. # This is useful for sharing your dotfiles
  15. # (e.g. using service like Dropbox or keeping
  16. # them in a shared VCS repository like git)
  17. #
  18. # DOTROOT - path where your shared dot-files
  19. # are.
  20. # PREFIX - where you want your links to
  21. # dot-files to be created ($HOME
  22. # by default)
  23. #
  24. # --------------------------------------------
  25. # By Alois Mahdal; no warranty
  26. # ============================================
  27. use strict;
  28. use warnings;
  29. use Getopt::Long;
  30. use File::Spec;
  31. sub usage { print STDERR "usage: $0: DOTROOT [PREFIX]\n"; exit 1; }
  32. my $dotroot;
  33. my $prefix;
  34. my $opts = GetOptions(
  35. 'dotroot=s' => \$dotroot,
  36. 'prefix=s' => \$prefix
  37. ) or usage;
  38. $dotroot = $dotroot // shift;
  39. $prefix = $prefix // shift;
  40. $prefix = $prefix // $ENV{HOME};
  41. $dotroot or usage;
  42. sub mklinks {
  43. my $dotroot = shift;
  44. my $prefix = shift;
  45. -d $dotroot or die "not a directory: $dotroot";
  46. my @dirs = `ls $dotroot`;
  47. foreach my $dir (@dirs) {
  48. chomp $dir;
  49. my $source = File::Spec->rel2abs("$dotroot/$dir");
  50. my $target = "$prefix/.$dir";
  51. `mkdir -p $prefix`;
  52. if (-e $target) {
  53. warn "target exists: $target\n";
  54. } else {
  55. `ln -s $source $target`;
  56. }
  57. }
  58. }
  59. mklinks($dotroot, $prefix);