From: Vincent Le Gallic Date: Sun, 18 Jan 2015 21:40:11 +0000 (+0100) Subject: [nettoie_musique] Pour rendre propre un dossier de Musique X-Git-Url: http://gitweb.pimeys.fr/?p=scripts-20-100.git;a=commitdiff_plain;h=5700b68713ea7c767fef2eccb3424f624ed29c95 [nettoie_musique] Pour rendre propre un dossier de Musique --- diff --git a/nettoie_musique.sh b/nettoie_musique.sh new file mode 100755 index 0000000..ef1d5fd --- /dev/null +++ b/nettoie_musique.sh @@ -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