]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - nettoie_musique.sh
[nettoie_musique] v2 : testé en conditions réelles, amélioré.
[scripts-20-100.git] / nettoie_musique.sh
1 #!/bin/bash
2
3 # Pour virer dans les dossiers de musique tout ce qui n'a rien à y foutre
4
5
6 #################################################################
7 ## Déclaration des variables ##
8 #################################################################
9 videoregex="\|avi\|wmv\|flv\|mp4\|mov\|mpe?g"
10 playlistregex="\|pls\|m3u"
11 textregex="\|txt"
12
13 #################################################################
14 ## Parsing des arguments ##
15 #################################################################
16 TEMP=`getopt -o vpt --long no-video,no-playlist,no-text -n 'nettoie_musique.sh' -- "$@"`
17
18 if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
19
20 eval set -- "$TEMP"
21
22 while true ; do
23 case "$1" in
24 -v|--no-video) videoregex='';;
25 -p|--no-playlist) playlistregex='';;
26 -t|--no-text) textregex='';;
27 --) shift ; break ;;
28 *) echo "Internal error!" ; exit 1 ;;
29 esac
30 shift
31 done
32
33 # Les arguments restants sont les dossiers qu'on parcourra
34 finddirs="$@"
35
36 #################################################################
37 ## Détermination de la regex ##
38 #################################################################
39
40 # On fusionne dedans les extensions de vidéo et de playlist
41 # sauf si elles ont été vidées par une option
42
43 # Les fichiers matchant cette regexp ne sont pas bazardés
44 regex="^.*\.\(wma\|mp3\|flac\|wav\|ogg\|m4a${videoregex}${playlistregex}${textregex}\)$"
45
46
47 echo $regex
48
49 #################################################################
50 ## Suppression des fichiers indésirables ##
51 #################################################################
52 # Quelques explications pour la suite :
53 # On veut faire un find -delete, mais en affichant le résultat avant
54 # Pour gérer les caractères foireux, on a besoin du -print0,
55 # mais ensuite, pour le handle, on fait ce tricks à base de read
56 # vider IFS et -d servent à redéfinir le délimiteur de read
57 # < <(…) fait de la tuyauterie, et on a besoin de faire ça
58 # parce que sinon le while est lancé dans un subshell et dès qu'on
59 # en sort, on oublie a, ce serait ballot.
60 # 3< et -u3 servent à faire passer cette tuyauterie par le descripteur
61 # 3 et pas 1, ce qui permet de toujours utiliser stdin dans le corps
62 # de la boucle
63 unset files i
64 while IFS= read -r -u3 -d $'\0' file; do
65 files[i++]="${file}";
66 done 3< <(find ${finddirs} -type f \! -regex ${regex} -print0)
67
68 if [ ${#files[@]} -eq 0 ]
69 then
70 echo "No file to remove."
71 else
72 # On affiche d'abord…
73 for i in "${files[@]}"; do echo "${i}"; done | less -SR
74
75 read -p "Remove all these unwanted files ? [y/N] " ans
76 # …on supprime ensuite
77 [[ "${ans}" = "y" ]] && for i in "${files[@]}"; do rm "${i}"; done
78 fi
79
80 #################################################################
81 ## Suppression des dossiers vides ##
82 #################################################################
83 # On recommence ensuite avec les dossiers vides
84 unset dirs
85 # pour exécuter la boucle while au moins une fois
86 dirs[0]=something
87
88 while [ ${#dirs[@]} -ne 0 ]
89 do
90 unset dirs i
91 while IFS= read -r -u3 -d $'\0' dir; do
92 dirs[i++]="${dir}";
93 done 3< <(find ${finddirs} -type d -empty -print0)
94
95 if [ ${#dirs[@]} -ne 0 ]
96 then
97 # On affiche d'abord…
98 for i in "${dirs[@]}"; do echo "${i}"; done | less -SR
99
100 read -p "Remove all these empty directories ? [y/N] " ans
101 # …on supprime ensuite
102 [[ "${ans}" = "y" ]] && for i in "${dirs[@]}"; do rmdir "${i}"; done
103 fi
104 done