aboutsummaryrefslogtreecommitdiffstats
path: root/bulkrename
blob: 5fb21344df4c1e776dce7b6799f4165f18a85cdd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/sh
# Copyright Cédric Picard 2014 -- License WTFPL
# Inspired by Ranger's -- See https://github.com/hut/ranger

set -e -u

if [ $# -ne 0 ] ; then
    { for i in "$@" ; do printf "%s\n" "$i" ; done } | "$0"
    exit $?
fi

EDITOR="${EDITOR:-vi}"

namebase="$(mktemp -d)/blkrn"
echo '# Modify filenames without removing any line, quitting aborts' \
    > "${namebase}.2"
tee -- "${namebase}.1" >> "${namebase}.2"
exec </dev/tty >/dev/tty \
    || { echo 'Interactive terminal needed' >&2 ; exit 1; }

"$EDITOR" "${namebase}.2"
sed -i -- '1d' "${namebase}.2"

if [ $(wc -l < "${namebase}.1") -ne $(wc -l < "${namebase}.2") ] ; then
    rm -r -- "$(dirname -- "${namebase}")"
    echo "Wrong number of lines" >&2 ; exit 1
fi

(echo '# Please review/modify this script or empty it to do nothing' \
    ; while read -r l1 <&3 && read -r l2 <&4; do
        [ "$l1" = "$l2" ] || printf "%s\n%s\n" "$l1" "$l2"
      done 3<"${namebase}.1" 4<"${namebase}.2" \
    | sed 's/\([\\"$`]\)/\\\1/g;s/^.*$/"&"/' \
    | xargs -d"\n" -L2 echo 'mv -i --') \
    > "${namebase}.sh"

if [ "$(wc -c < "${namebase}.sh")" -ne 0 ] ; then
    "$EDITOR" -- "${namebase}.sh"
    sh -e -- "${namebase}.sh"
fi

rm -r -- "$(dirname "${namebase}")"