web-dev-qa-db-fra.com

Déplacer des fichiers vers des répertoires en fonction de l'extension

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.

18
cyberpirate92

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.

32
AMADANON Inc.

Deux façons:

  1. find . -name '*mp3' -or -name '*ogg' -print | xargs -J% mv % ../../Music
  2. 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.

11
hd1

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
2

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).

2
Regis Barbosa

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
0
Richard L