2009-06-16 7 views
1

J'ai des milliers de mp3 dans une structure de dossier complexe qui réside dans un seul dossier. Je voudrais déplacer tous les mp3s dans un répertoire simple sans sous-dossiers. Je peux penser à une variété de façons de le faire en utilisant la commande find mais un problème sera des noms de fichiers en double. Je ne veux pas remplacer les fichiers car j'ai souvent plusieurs versions d'une même chanson. Auto-renommer serait le meilleur. Je ne me soucie pas vraiment comment les fichiers sont renommés.Comment puis-je copier tous mes fichiers désorganisés dans un seul répertoire? (sur Linux)

Quelqu'un connaît-il un moyen simple et sûr de le faire?

+0

Comment est-ce pas une programmation connexe? –

+0

Je suis d'accord sur le fait que c'est lié à la programmation, mais la question fait que ce n'est pas évident. Vous demandez essentiellement comment écrire un programme qui résout son problème. Peut-être que vous devriez éditer la question pour souligner cet aspect et vous l'obtiendrez rouvert. – rmeador

Répondre

6

Vous pouvez changer un chemin a/b/c.mp3 dans a - b - c.mp3 après la copie. Voici une solution dans Bash:

 
find srcdir -name '*.mp3' -printf '%P\n' | 
    while read i; do 
     j="${i//\// - }" 
     cp -v "srcdir/$i" "dstdir/$j" 
    done 

Et dans une coquille sans ${//} substitution:

 
find srcdir -name '*.mp3' -printf '%P\n' | 
    sed -e 'p;s:/: - :g' | 
    while read i; do 
     read j 
     cp -v "srcdir/$i" "dstdir/$j" 
    done 

Pour un régime différent, GNU de cp et mv pouvez effectuer des sauvegardes numérotées au lieu d'écraser - voir -b/--backup[=CONTROL] dans les pages de manuel.

 
find srcdir -name '*.mp3' -exec cp -v --backup=numbered {} dstdir/ \; 
1

J'aurais tendance à le faire dans un script simple plutôt que d'essayer de rentrer dans une seule ligne de commande. Par exemple, en python, il serait relativement trivial de faire un walk() dans le répertoire, en copiant chaque fichier mp3 trouvé dans un répertoire différent avec un nombre incrémenté automatiquement. Si vous voulez obtenir un colombophile, vous pouvez avoir un dictionnaire des noms de fichiers existants, et simplement ajouter un numéro aux duplicata. (L'indice du dictionnaire étant le nom du fichier, et la valeur étant le nombre de fichiers trouvés à ce jour, qui deviendra votre suffixe)

1
find /path/to/mp3s -name *.mp3 -exec mv \{\} /path/to/target/dir \; 
+2

cela ne traitera pas le problème de noms de fichiers en double mentionné dans la question – Glen

1

Au risque de nombreux downvotes, un script Perl pourrait être écrit dans peu de temps pour accomplir cela.

pseudocode:

while (-e filename) 
    change filename to filename . "1"; 
2

bash comme pseudo-code:

for i in `find . -name "*.mp3"`; do 
    NEW_NAME = `basename $i` 
    X=0 
    while ! -f move_to_dir/$NEW_NAME 
     NEW_NAME = $NEW_NAME + incr $X 

    mv $i $NEW_NAME 
done 
2
#!/bin/bash 
NEW_DIR=/tmp/new/ 

IFS=" 
"; for a in `find . -type f ` 
    do 
    echo "$a" 
    new_name="`basename $a`" 
    while test -e "$NEW_DIR/$new_name" 
      do 
      new_name="${new_name}_" 
      done 
    cp "$a" "$NEW_DIR/$new_name" 
    done 
1

En python: déplacer réellement le fichier, le changement debug = False

import os, re 
from_dir="/from/dir" 
to_dir = "/target/dir" 
re_ext = "\.mp3" 
debug = True 

w = os.walk(from_dir) 
n = w.next() 
while n: 
    d, arg, names = n 
    names = filter(lambda fn: re.match(".*(%s)$"%re_ext, fn, re.I) , names) 
    n = w.next() 
    for fn in names: 
     from_fn  = os.path.join(d,fn) 
     target_fn = os.path.join(to_dir, fn) 
     file_exists = os.path.exists(target_fn) 
     if not debug: 
      if not file_exists: 
       os.rename(from_fn, target_fn) 
      else: 
       print "DO NOT MOVE - FILE EXISTS ", from_fn 
     else: 
      print "MOVE ", from_fn, " TO " , target_fn 
1

Puisque vous ne se soucient pas comment les fichiers en double sont nommés, utilisez l'option 'backup' sur le mouvement:

find /path/to/mp3s -name *.mp3 -exec mv --backup=numbered {} /path/to/target/dir \; 

Est-ce que vous obtenez:

    chanson
  • . mp3
  • song.mp3. ~ 1 ~
  • song.mp3. ~ 2 ~
Questions connexes