2010-01-31 3 views
5

J'ai des centaines de fichiers texte dans un dossier nommé en utilisant ce type de convention de nommage:Comment créer des dossiers en utilisant des noms de fichiers, puis déplacer des fichiers dans des dossiers?

Bandname1 - song1.txt 
Bandname1 - song2.txt 
Bandname2 - song1.txt 
Bandname2 - song2.txt 
Bandname2 - song3.txt 
Bandname3 - song1.txt 
..etc. 

Je voudrais créer des dossiers pour différents groupes et déplacer des fichiers texte dans ces dossiers selon. Comment pourrais-je y parvenir en utilisant bash, perl ou script python?

+4

Envisageriez-vous d'écrire un script pour le faire par vous-même et le poster ici? Je pense que ce serait beaucoup plus instructif si les gens commentaient cela plutôt que d'en écrire un pour vous. –

Répondre

1

réponse de gregseth de fonctionnera, juste. remplacez trim par xargs Vous pouvez également éliminer le test if en utilisant simplement mkdir -p, par exemple :

for f in *.txt; do 
    band=$(echo "$f" | cut -d'-' -f1 | xargs) 
    mkdir -p "$band" 
    mv "$f" "$band" 
done 

strictement parler trim ou xargs ne devrait même pas être nécessaire, mais xargs sera au moins enlever toute forme supplémentaire, il ne fait pas mal.

0

Que diriez-vous ceci:

for f in *.txt 
do 
    band=$(echo "$f" | cut -d'-' -f1 | trim) 
    if [ -d "$band" ] 
    then 
    mkdir "$band" 
    fi 
    mv "$f" "$band" 
done 
+0

Merci, mais mon Bash (je suis sur mac 10.6.2) dit que -bash: couper: commande introuvable J'ai essayé textutil :: texte mais j'ai eu la même réponse – jrara

1

Vous avez demandé un script spécifique, mais si cela est pour l'organisation de votre musique, vous voudrez peut-être vérifier EasyTAG. Il a extrêmement règles spécifiques et puissantes que vous pouvez personnaliser pour organiser votre musique comme vous le voulez:

alt text http://easytag.sourceforge.net/images/screenshot-gtk2/screenshot_sw_scan_tag.png

Cette règle dit, « assumer mes noms de fichiers sont dans la structure » [artiste] - [titre de l'album]/[numéro de piste] -. [title] » Ensuite, vous pouvez les marquer en tant que telle, ou de déplacer les fichiers pour tout nouveau modèle, ou faire à peu près tout le reste

-1
ls |perl -lne'$f=$_; s/(.+?) - [^-]*\.txt/$1/; mkdir unless -d; rename $f, "$_/$f"' 
0

Ce programme Python suppose que les fichiers source sont data et que la nouvelle structure de répertoire doit être target (et qu'il existe déjà).

Le point clé est que os.path.walk traversera la structure de répertoires data et appellera myVisitor pour chaque fichier.

import os 
import os.path 

sourceDir = "data" 
targetDir = "target" 

def myVisitor(arg, dirname, names): 
    for file in names: 
     bandDir = file.split("-")[0] 
     newDir = os.path.join(targetDir, bandDir) 
     if (not os.path.exists(newDir)): 
      os.mkdir(newDir) 

     newName = os.path.join(newDir, file) 
     oldName = os.path.join(dirname, file) 

     os.rename(oldName, newName) 

os.path.walk(sourceDir, myVisitor, None) 
4

Il est pas nécessaire d'utiliser la garniture ou xargs:

for f in *.txt; do 
    band=${f% - *} 
    mkdir -p "$band" 
    mv "$f" "$band" 
done 
+0

+1 pour ne pas utiliser d'outils externes – ghostdog74

+0

band = $ {f% - *}, non? – pra

+0

@pra: Oui, merci. –

2

avec Perl

use File::Copy move; 
while (my $file= <*.txt>){ 
    my ($band,$others) = split /\s+-\s+/ ,$file ; 
    mkdir $band; 
    move($file, $band); 
} 
Questions connexes