diff options
author | Andrew Cady <d@jerkface.net> | 2018-09-11 15:42:51 -0400 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2018-09-11 15:42:51 -0400 |
commit | 8a448e9321e29d6779f4f4b76bc4c10ebb6c620b (patch) | |
tree | 3d941af3921fdc422ca30f68ef9f2cb57cc34639 | |
parent | f864cade7f6dcdb7aef4fbcdb6ac17c008a09e03 (diff) |
interactive-rename
-rwxr-xr-x | dot/local/bin/interactive-rename | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/dot/local/bin/interactive-rename b/dot/local/bin/interactive-rename new file mode 100755 index 0000000..e8017c7 --- /dev/null +++ b/dot/local/bin/interactive-rename | |||
@@ -0,0 +1,28 @@ | |||
1 | #!/usr/bin/perl -w | ||
2 | use File::Temp (); | ||
3 | $tmp = new File::Temp(UNLINK=>1); | ||
4 | |||
5 | # TODO: | ||
6 | # escape & unescape linefeeds | ||
7 | # handle nonexistent files better | ||
8 | # handle system() errors | ||
9 | |||
10 | @ARGV = grep {-e $_} @ARGV; | ||
11 | die "No files!\n" unless @ARGV; | ||
12 | |||
13 | for (@ARGV) { | ||
14 | m(\n) && die "Sorry - can't do filenames with linefeeds (yet)\n"; | ||
15 | print $tmp "$_\n"; | ||
16 | } | ||
17 | |||
18 | $editor = $ENV{VISUAL} || $ENV{EDITOR} || 'vi'; | ||
19 | system($editor, $tmp) == 0 or die; | ||
20 | |||
21 | seek($tmp, 0, 0) or die "seek: $!"; | ||
22 | @newname = <$tmp>; | ||
23 | chomp for @newname; | ||
24 | die "number of names changed!\n" unless @newname == @ARGV; | ||
25 | |||
26 | for (0 .. $#ARGV) { | ||
27 | rename($ARGV[$_], $newname[$_]) unless $ARGV[$_] eq $newname[$_]; | ||
28 | } | ||