]> gitweb.pimeys.fr Git - scripts-20-100.git/commitdiff
[nettoie_musique] Pour rendre propre un dossier de Musique
authorVincent Le Gallic <legallic@crans.org>
Sun, 18 Jan 2015 21:40:11 +0000 (22:40 +0100)
committerVincent Le Gallic <legallic@crans.org>
Sun, 18 Jan 2015 21:40:11 +0000 (22:40 +0100)
nettoie_musique.sh [new file with mode: 0755]

diff --git a/nettoie_musique.sh b/nettoie_musique.sh
new file mode 100755 (executable)
index 0000000..ef1d5fd
--- /dev/null
@@ -0,0 +1,60 @@
+#!/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