Remove Unused Assets from a Cinelerra XML Project File
This is a bash script to remove all the unwanted assets from a Cinelerra project XML file. I needed it to cut out bloat from a project I was working on which had hundreds of unused resources after I split the project up into ten minute chunks. Doing so stopped Cinelerra from crashing when I loaded the project: YMMV.
Save this script as “remove_unused_assets.sh”. It needs the function in “list_unused_assets.sh” which I posted here.
#kk remove_unused_assets.sh
#kk
#kk For cinelerra xml files
#kk this script removes the contents of asset tags which are not also used for edits
if [ -z "$1" -o "$1" = "-h" ]
then
echo “Usage: remove_unused_assets [xml_filename]“
echo “For cinelerra xml files, this script removes the contents of asset tags which are not being used for edits”
exit
fi
TMPDIR=”/tmp”
SCRIPTDIR=”$HOME/Video/video_new/common/scripts”
. $SCRIPTDIR/list_unused_assets.sh
. $SCRIPTDIR/include.inc
#assign the parameter to a variable
XMLFILE=$1
#location of the temporary files
ASSETS_FILE=”$TMPDIR/ASSETS_FILE”
EDITS_FILE=”$TMPDIR/EDITS_FILE”
XMLFILE_NEW=”$1″_new
XMLFILE_TMP=”$TMPDIR/XMLFILE_TMP”
#check if the xml file exists and exit if it does not
if [ ! -e $XMLFILE ]; then error “XML file does not exist”; fi
list_unused_assets $XMLFILE
if [ $? != 0 ] ; then error “list_unused_assets failed”; fi
cp $XMLFILE $XMLFILE_TMP
echo
echo Removing Unused Assets…
echo
echo “Working…”
echo
# loop through the list of unused assets and remove the ASSET tag lines for each
# sed command from here: http://ilfilosofo.com/blog/2008/04/26/sed-multi-line-search-and-replace/
for f in $( comm -23 $ASSETS_FILE $EDITS_FILE ); do
#to make the filename string work in sed, I have to escape all of the periods and slashes
FORMATTED_f=`echo “$f” | sed -e ‘s:\/:\\\/:g’ -e ‘s:\.:\\\.:g’`
#this complicated sed script came from the sed FAQ: http://sed.sourceforge.net/sedfaq4.html#s4.21
#in order to make the variable substitution work, I had to close the sed script with a single quote
#then enclose the variable in double quotes, then re-open the sed script with a single quote
#the -i option is for editing a file “in place”
sed -i -e ‘
# sed script to delete a block if /regex/ matches inside it
:Top
/\
/\/ASSET\>/!{ # If we are not at the /end/ marker
$!{ # nor the last line of the file,
N; # add the Next line to the pattern space
b Top
} # and branch (loop back) to the :Top label.
} # This line matches the /end/ marker.
/’”$FORMATTED_f”‘/d; # If /regex/ matches, delete the block.
} # Otherwise, the block will be printed.
#—end of script—
‘ $XMLFILE_TMP
#diff $XMLFILE $XMLFILE_TMP
echo -n ‘ \r’
echo -n $f’\r’
done
cp $XMLFILE_TMP $XMLFILE_NEW
echo
list_unused_assets $XMLFILE_NEW
echo
echo Finished.
echo
echo The new version of the xml file has been saved as $XMLFILE_NEW.
echo
This program depends on include.inc which contains the following:
#use colour in the output just for fun
GREEN=$(printf “\033[32m”)
RED=$(printf “\033[31m”)
NC=$(printf “\033[0m”)
error()
{
echo ERROR: $1
exit 1
}
I tried to make these scripts as tidy and portable as possible — you will, however, need to change the path for $SCRIPTDIR to the location you are using (and $TMPDIR if you don’t want to put your temporary files in /tmp).