J'écris ceci à partir de ma tête, donc c'est un code non testé, mais cela devrait vous mettre sur la bonne voie. En gros, il parcourt l'arbre que vous lui indiquez, à la recherche de fichiers .rar. Lorsqu'elle en trouve un, elle le décompresse sur place et supprime l'archive originale, sauf si unrar renvoie un résultat différent de zéro. Si elle trouve un dossier, la fonction s'appelle elle-même, ce qui la rend récursive.
#!/bin/bash
[[ ! -d "$1" ]] && echo "Please point me at a directory!" && exit 1
function recursively_extract_all_rars_in() {
local x=`pwd` f
cd "$1"
for f in (*); do
[[ -d "$f" ]] && recursively_extract_all_rars_in "$f"
[[ -f "$f" ]] && [[ "$f" =~ "*.rar" ]] && unrar e "$f" && rm ${f%%.*}.r??
done
cd "$x"
}
recursively_extract_all_rars_in "$1"
Le nom de la fonction est complètement arbitraire. J'aime qu'elles se lisent comme du bon anglais lorsqu'elles sont invoquées avec leurs arguments. [[ -d /path ]]
renvoie vrai si le chemin existe et est un répertoire. -f
fait la même chose pour les fichiers. [[ "string" =~ "pattern"]]
est un bashisme qui permet de faire du pattern matching dans les chaînes de caractères. Il fonctionne essentiellement comme les motifs globaux.
La ligne local x=pwd f
peut sembler énigmatique, mais il définit simplement deux variables locales : une appelée x, pour contenir la variable pwd
et un appelé f, non initialisé (il est initialisé dans le boucle for ci-dessous, je le déclare juste ici pour qu'il soit local).
Stocker le pwd
et y revenir si votre fonction utilise cd
est une bonne chose (tm).
Veuillez noter qu'en utilisant la sortie de ls
de manière programmatique est généralement une mauvaise chose, et vous devriez l'éviter comme la peste, en faveur de find
. Si l'un de vos noms de fichiers contient un espace, l'utilisation de ls dans votre script sera un gros problème. Vous avez été prévenus.
ZSH
Je ne suis pas sûr que vous puissiez faire la même chose en Bash, mais en ZSH, je mettrais ce qui suit quelque part dans le fichier .zshrc
function recursive_unrar() {
for f in **/*.rar; do
local cwd=`pwd` fbn=${f##*/}
cd "${f%/*}"
unrar e "$fbn"
rm "${fbn%%.*}.r{01..99} $fbn"
cd "$cwd"
done
}
Et ensuite, il suffit de l'appeler depuis le dossier correspondant.