--- /dev/null
+#!/bin/bash
+
+# Pour virer dans les dossiers de musique tout ce qui n'a
+# rien à y foutre
+
+dir=$1
+
+# Les fichiers matchant cette regexp ne sont pas bazardés
+regex='^.*\.\(wma\|mp[34]\|flac\|m3u\|wav\|ogg\)$'
+
+# Quelques explication :
+# On veut faire un find -delete, mais en affichant le résultat avant
+# Pour gérer les caractères foireux, on a besoin du -print0,
+# mais ensuite, pour le handle, on fait ce tricks à base de read
+# vider IFS et -d servent à redéfinir le délimiteur de read
+# < <(…) fait de la tuyauterie, et on a besoin de faire ça
+# parce que sinon le while est lancé dans un subshell et dès qu'on
+# en sort, on oublie a, ce serait ballot.
+# 3< et -u3 servent à faire passer cette tuyauterie par le descripteur
+# 3 et pas 1, ce qui permet de toujours utiliser stdin dans le corps
+# de la boucle
+unset files i
+while IFS= read -r -u3 -d $'\0' file; do
+ files[i++]="${file}";
+done 3< <(find ${dir} -type f \! -regex ${regex} -print0)
+
+if [ ${#files[@]} -eq 0 ]
+then
+ echo "No file to remove."
+else
+ # On affiche d'abord…
+ for i in "${files[@]}"; do echo "${i}"; done | less -SR
+
+ read -p "Remove all these unwanted files ? [y/N] " ans
+ # …on supprime ensuite
+ [[ "${ans}" = "y" ]] && for i in "${files[@]}"; do rm "${i}"; done
+fi
+
+# On recommence ensuite avec les dossiers vides
+unset dirs
+# pour exécuter la boucle while au moins une fois
+dirs[0]=something
+
+while [ ${#dirs[@]} -ne 0 ]
+do
+ unset dirs i
+ while IFS= read -r -u3 -d $'\0' d; do
+ dirs[i++]="${d}";
+ done 3< <(find ${dir} -type d -empty -print0)
+
+ if [ ${#dirs[@]} -ne 0 ]
+ then
+ # On affiche d'abord…
+ for i in "${dirs[@]}"; do echo "${i}"; done | less -SR
+
+ read -p "Remove all these empty directories ? [y/N] " ans
+ # …on supprime ensuite
+ [[ "${ans}" = "y" ]] && for i in "${dirs[@]}"; do rmdir "${i}"; done
+ fi
+done