Je suis nouveau sur Linux. J'essaie d'écrire un script Shell qui va déplacer des fichiers vers certains dossiers en fonction de leur extension, comme par exemple dans mon dossier de téléchargements, j'ai tous les fichiers de types de fichiers mixtes. J'ai écrit le script suivant
mv *.mp3 ../Music
mv *.ogg ../Music
mv *.wav ../Music
mv *.mp4 ../Videos
mv *.flv ../Videos
Comment puis-je le faire fonctionner automatiquement lorsqu'un fichier est ajouté à ce dossier? Maintenant, je dois exécuter manuellement le script à chaque fois.
Une autre question, est-il possible de combiner ces 2 déclarations
mv *.mp3 ../../Music
mv *.ogg ../../Music
en une seule déclaration? J'ai essayé d'utiliser ||
(Programmation C ou opérateur) et virgule mais ils ne semblent pas fonctionner.
Il n'y a pas de déclencheur lorsqu'un fichier est ajouté à un répertoire. Si le fichier est téléchargé via une page Web, vous pourrez peut-être faire en sorte que la page Web le fasse.
Vous pouvez mettre un script dans crontab pour ce faire, sur des machines Unix (ou une tâche planifiée dans Windows). Google crontab pour un guide pratique.
Quant à la combinaison de vos commandes, utilisez ce qui suit:
mv *.mp3 *.ogg ../../Music
Vous pouvez inclure autant de "globes" différents (noms de fichiers avec caractères génériques) que vous le souhaitez. La dernière chose devrait être le répertoire cible.
Deux façons:
find . -name '*mp3' -or -name '*ogg' -print | xargs -J% mv % ../../Music
find . -name '*mp3' -or -name '*ogg' -exec mv {} ../Music \;
Le premier utilise un canal et peut manquer d'espace d'argument; tandis que le second peut utiliser trop de fourches et être plus lent. Mais, les deux fonctionneront.
incron surveillera le système de fichiers et exécutera des commandes d'exécution sur certains événements.
Vous pouvez combiner plusieurs commandes sur une seule ligne à l'aide d'un séparateur de commandes. Le séparateur de commande sérialisé inconditionnel est ;
.
command1 ; command2
Une autre façon est:
mv -v {*.mp3,*.ogg,*.wav} ../Music
mv -v {*.mp4,*.flv} ../Videos
PS: l'option -v montre ce qui se passe (verbeux).
J'aime cette méthode:
#!/bin/bash
for filename in *; do
if [[ -f "$filename" ]]; then
base=${filename%.*}
ext=${filename#$base.}
mkdir -p "${ext}"
mv "$filename" "${ext}"
fi
done