mirror of
https://github.com/ctm/executor.git
synced 2024-12-22 13:30:41 +00:00
133 lines
3.4 KiB
Bash
Executable File
133 lines
3.4 KiB
Bash
Executable File
#! /bin/bash
|
|
|
|
# This script is designed to create a "/home/executor.afpd/System Folder"
|
|
# directory from an existing "/home/executor".
|
|
|
|
if [ -e "/home/executor.afpd" ]; then
|
|
echo You already have an executor.afpd -- quitting 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
# map %XX into :xx. We have to peer into ambiguous filenames, for
|
|
# instance, is %FATHER the apple-double file associated with FATHER,
|
|
# or should %FA be mapped to :fa? The answer is dependent on file
|
|
# contents. ugh!
|
|
|
|
translate_special_characters ()
|
|
{
|
|
# split directory from filename. We don't want to change any of the
|
|
# characters in the directory portion
|
|
|
|
if echo "$1" | grep / > /dev/null; then
|
|
directory=`expr "$1" : '\(.*\)/'`/
|
|
filename=`basename "$1"`
|
|
else
|
|
directory=""
|
|
filename="$1"
|
|
fi
|
|
|
|
# first we need to see if there's a leading % that we need to preserve
|
|
# The rule is that we will preserve it if file says we're dealing with
|
|
# an Apple Double file
|
|
|
|
if expr "$filename" : % > /dev/null; then
|
|
if file "$filename" | grep AppleDouble > /dev/null; then
|
|
directory=`echo $directory%`
|
|
filename=`expr "$filename" : '%\(.*\)'`
|
|
fi
|
|
fi
|
|
|
|
# For lack of string processing facilities, we break the string up into
|
|
# parts, use tr on the XX part, then put things back
|
|
|
|
mid=1
|
|
until [ x$mid = x ]; do
|
|
head=`expr "$filename" : '\(.*\)%[0-9a-fA-F][0-9a-fA-F]'`
|
|
mid=`expr "$filename" : '.*%\([0-9a-fA-F][0-9a-fA-F]\)'`
|
|
tail=`expr "$filename" : '.*%[0-9a-fA-F][0-9a-fA-F]\(.*\)'`
|
|
|
|
if [ x$mid != x ]; then
|
|
mid=:`echo "$mid" | tr '[A-F]' '[a-f]'`
|
|
string="$mid$tail$string"
|
|
filename="$head"
|
|
fi
|
|
done
|
|
|
|
echo "$directory$filename$string"
|
|
}
|
|
|
|
# relocate_double expects to read a list of directories that need to
|
|
# be cleaned up. It would be nice if we could use read0 like xargs -0
|
|
# so we don't get burned by directory names with embedded newlines,
|
|
# but those are fairly rare and probably cause trouble with other shell
|
|
# scripts.
|
|
|
|
relocate_double ()
|
|
{
|
|
while read d; do
|
|
pushd "$d" > /dev/null
|
|
if [ ! -e .AppleDouble ]; then
|
|
mkdir .AppleDouble
|
|
fi
|
|
chmod --reference=. .AppleDouble
|
|
|
|
# first pass, rename all directories and apple-double pairs
|
|
|
|
for f in *; do
|
|
g=`translate_special_characters "$f"`
|
|
if [ -d "$f" ]; then
|
|
if [ "$f" != "$g" ]; then
|
|
mv "$f" "$g"
|
|
fi
|
|
if [ -f %"$f" ]; then
|
|
\rm %"$f"
|
|
fi
|
|
else
|
|
if [ -f %"$f" ]; then
|
|
mv -f %"$f" .AppleDouble/"$g"
|
|
if [ "$f" != "$g" ]; then
|
|
mv "$f" "$g"
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# second pass, rename all remaining entries
|
|
|
|
for f in *; do
|
|
g=`translate_special_characters "$f"`
|
|
if [ "$f" != "$g" ]; then
|
|
mv "$f" "$g"
|
|
fi
|
|
done
|
|
|
|
popd > /dev/null
|
|
|
|
# now rename ourselves
|
|
|
|
e=`translate_special_characters "$d"`
|
|
if [ "$d" != "$e" ]; then
|
|
mv "$d" "$e"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Ick. We assume /home and /home/executor
|
|
|
|
pushd /home > /dev/null
|
|
mkdir executor.afpd
|
|
cp -pR "executor/System Folder" executor.afpd
|
|
find "executor.afpd/System Folder" -depth -type d -print | relocate_double
|
|
|
|
# godata.sav will refer to traditionally named AppleDouble files, which
|
|
# will not be understood.
|
|
|
|
\rm "executor.afpd/System Folder/.AppleDouble/godata.sav"
|
|
> "executor.afpd/System Folder/godata.sav"
|
|
|
|
# preference files may also refer to old files -- nuke them
|
|
|
|
find "executor.afpd/System Folder/Preferences" -type f -print0 | xargs -0 rm
|
|
|
|
popd > /dev/null
|