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).
Comments are closed.
July 8, 2011 - 10:34 am
Hi..
This is a great script btw. But doesn’t work now.. Shows some error..
July 25, 2011 - 10:40 am
It still works for me. Make sure you create the other two scripts as well as this one depends on them. You’ll need to change the paths of SCRIPTDIR in the program so it can find them.