]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - nettoie_musique.sh
typo
[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 #################################################################
48 ## Suppression des fichiers indésirables ##
49 #################################################################
50 # Quelques explications pour la suite :
51 # On veut faire un find -delete, mais en affichant le résultat avant
52 # Pour gérer les caractères foireux, on a besoin du -print0,
53 # mais ensuite, pour le handle, on fait ce tricks à base de read
54 # vider IFS et -d servent à redéfinir le délimiteur de read
55 # < <(…) fait de la tuyauterie, et on a besoin de faire ça
56 # parce que sinon le while est lancé dans un subshell et dès qu'on
57 # en sort, on oublie a, ce serait ballot.
58 # 3< et -u3 servent à faire passer cette tuyauterie par le descripteur
59 # 3 et pas 1, ce qui permet de toujours utiliser stdin dans le corps
60 # de la boucle
61 unset files i
62 while IFS= read -r -u3 -d $'\0' file; do
63 files[i++]="${file}";
64 done 3< <(find ${finddirs} -type f \! -regex ${regex} -print0)
65
66 if [ ${#files[@]} -eq 0 ]
67 then
68 echo "No file to remove."
69 else
70 # On affiche d'abord…
71 for i in "${files[@]}"; do echo "${i}"; done | less -SR
72
73 read -p "Remove all these unwanted files ? [y/N] " ans
74 # …on supprime ensuite
75 [[ "${ans}" = "y" ]] && for i in "${files[@]}"; do rm "${i}"; done
76 fi
77
78 #################################################################
79 ## Suppression des dossiers vides ##
80 #################################################################
81 # On recommence ensuite avec les dossiers vides
82 unset dirs
83 # pour exécuter la boucle while au moins une fois
84 dirs[0]=something
85
86 while [ ${#dirs[@]} -ne 0 ]
87 do
88 unset dirs i
89 while IFS= read -r -u3 -d $'\0' dir; do
90 dirs[i++]="${dir}";
91 done 3< <(find ${finddirs} -type d -empty -print0)
92
93 if [ ${#dirs[@]} -ne 0 ]
94 then
95 # On affiche d'abord…
96 for i in "${dirs[@]}"; do echo "${i}"; done | less -SR
97
98 read -p "Remove all these empty directories ? [y/N] " ans
99 # …on supprime ensuite
100 [[ "${ans}" = "y" ]] && for i in "${dirs[@]}"; do rmdir "${i}"; done
101 fi
102 done