svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done
Il présente les caractéristiques suivantes :
- Les fichiers ignorés et non suivis sont supprimés.
- Cela fonctionne même si le nom d'un fichier contient des espaces (à l'exception de la nouvelle ligne, mais il n'y a pas grand-chose à faire à ce sujet, à part utiliser l'attribut
--xml
et analyser la sortie xml qui en résulte)
- Cela fonctionne même si
svn status
imprime d'autres caractères d'état avant le nom du fichier (ce qui ne devrait pas être le cas puisque les fichiers ne sont pas suivis, mais juste au cas où...)
- Il devrait fonctionner sur tout système compatible POSIX.
J'utilise un shell script nommé svnclean
qui contient les éléments suivants :
#!/bin/sh
# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1
svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
# tell the user which file is being deleted. use printf
# instead of echo because different implementations of echo do
# different things if the arguments begin with hyphens or
# contain backslashes; the behavior of printf is consistent
printf '%s\n' "Deleting ${f}..."
# if rm -rf can't delete the file, something is wrong so bail
rm -rf "${f}" || exit 1
done