]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - nettoie_musique.sh
[nettoie_musique] Pour rendre propre un dossier de Musique
[scripts-20-100.git] / nettoie_musique.sh
1 #!/bin/bash
2
3 # Pour virer dans les dossiers de musique tout ce qui n'a
4 # rien à y foutre
5
6 dir=$1
7
8 # Les fichiers matchant cette regexp ne sont pas bazardés
9 regex='^.*\.\(wma\|mp[34]\|flac\|m3u\|wav\|ogg\)$'
10
11 # Quelques explication :
12 # On veut faire un find -delete, mais en affichant le résultat avant
13 # Pour gérer les caractères foireux, on a besoin du -print0,
14 # mais ensuite, pour le handle, on fait ce tricks à base de read
15 # vider IFS et -d servent à redéfinir le délimiteur de read
16 # < <(…) fait de la tuyauterie, et on a besoin de faire ça
17 # parce que sinon le while est lancé dans un subshell et dès qu'on
18 # en sort, on oublie a, ce serait ballot.
19 # 3< et -u3 servent à faire passer cette tuyauterie par le descripteur
20 # 3 et pas 1, ce qui permet de toujours utiliser stdin dans le corps
21 # de la boucle
22 unset files i
23 while IFS= read -r -u3 -d $'\0' file; do
24 files[i++]="${file}";
25 done 3< <(find ${dir} -type f \! -regex ${regex} -print0)
26
27 if [ ${#files[@]} -eq 0 ]
28 then
29 echo "No file to remove."
30 else
31 # On affiche d'abord…
32 for i in "${files[@]}"; do echo "${i}"; done | less -SR
33
34 read -p "Remove all these unwanted files ? [y/N] " ans
35 # …on supprime ensuite
36 [[ "${ans}" = "y" ]] && for i in "${files[@]}"; do rm "${i}"; done
37 fi
38
39 # On recommence ensuite avec les dossiers vides
40 unset dirs
41 # pour exécuter la boucle while au moins une fois
42 dirs[0]=something
43
44 while [ ${#dirs[@]} -ne 0 ]
45 do
46 unset dirs i
47 while IFS= read -r -u3 -d $'\0' d; do
48 dirs[i++]="${d}";
49 done 3< <(find ${dir} -type d -empty -print0)
50
51 if [ ${#dirs[@]} -ne 0 ]
52 then
53 # On affiche d'abord…
54 for i in "${dirs[@]}"; do echo "${i}"; done | less -SR
55
56 read -p "Remove all these empty directories ? [y/N] " ans
57 # …on supprime ensuite
58 [[ "${ans}" = "y" ]] && for i in "${dirs[@]}"; do rmdir "${i}"; done
59 fi
60 done