1#! /bin/bash
2#
3# From: c2a192@ugrad.cs.ubc.ca (Kazimir Kylheku)
4# Newsgroups: comp.unix.shell,comp.os.linux.misc
5# Subject: GNU Bash Script to fix filenames
6# Date: 28 Mar 1996 14:54:43 -0800
7# Organization: Computer Science, University of B.C., Vancouver, B.C., Canada
8#
9#This is a script which takes a list of directories, descends through each one
10#and ``corrects'' filenames that:
11#
12#   -	contain filename globbing characters: * ? [ ]
13#   -	quote characters: ' "
14#   -	control characters: 0-31 (127 is not dealt with---oops)
15#   -	- or + as the first character
16#
17# The GNU version of 'tr' is required. Also requires 'sed'.
18#
19# Script to process a given list of directories recursively
20# and rename each file to something that is reasonable.
21#
22# The rules are:
23#
24# 1. replace each space, [, ], *, ", and ' character in the name with a
25#    period.
26# 2. replace each control character 1..31 with a printable character obtained
27#    by adding 64 to the ascii value. ^A becomes A, ^B becomes B and so on.
28# 3. replace a - or + occuring at the beginning of the name with a #
29#
30# 4. if the resulting name has been changed in any way, then
31# 5.    if a file of the new name already exists, then
32# 6.            add a . to the new name and goto step 5.
33# 7. rename the old name to the new name
34#
35# written by Kaz Kylheku <kaz@cafe.net>
36# March 1996
37# Vancouver, Canada
38#
39# requires GNU 'bash', GNU 'tr', and some sort of 'sed' program.
40#
41# minimal conversion to bash v2 syntax done by Chet Ramey
42
43processfile()
44{
45        new_name="`echo -n $1 | tr '\173\175\052\077\042\047 ' '.......' |
46                        tr '[\000-\037]' '[\100-\137]' |
47                        sed -e 's/^-/#/' -e 's/+/#/'`"
48        if [ "$new_name" != "$1" ] ; then
49                while [ -e "$new_name" ] ; do
50                        new_name="${new_name}."
51                done
52                echo changing \"$1\" to \"$new_name\" in `pwd`
53                mv -- "$1" "$new_name"
54        fi
55}
56
57processdir()
58{
59        set -f
60        local savepwd="$PWD"
61        if cd "$1" ; then
62                set +f
63                for file in * ; do
64                        set -f
65                        if [ "$file" != "." ] && [ "$file" != ".." ] ; then
66                                if [ -L "$file" ] ; then
67                                        echo "skipping symlink" $file in `pwd`
68                                elif [ -d "$file" ] ; then
69                                        processdir "$file"
70                                elif [ -f "$file" ] ; then
71                                        processfile "$file"
72                                fi
73                        fi
74                done
75                cd "$savepwd"
76        fi
77}
78
79shopt -s nullglob dotglob
80
81if [ $# = 0 ] ; then
82        echo "$0: must specify a list of directories" >&2
83	echo "$0: usage: $0 directory [directory ...]" >&2
84	exit 2
85fi
86
87while [ $# != 0 ] ; do
88        processdir "$1"
89        shift
90done
91
92exit 0
93