2010-01-31 13 views
5

Ho centinaia di file di testo in una cartella denominata utilizzando questo tipo di convenzione di denominazione:Come creare cartelle usando i nomi dei file e quindi spostare i file in cartelle?

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

vorrei creare cartelle per le bande diverse e spostare i file di testo in base a queste cartelle. Come potrei ottenere questo usando script bash, perl o python?

+4

Volete non crei una script per fare questo da soli e la pubblicazione qui? Penso che sarebbe molto più istruttivo se le persone commentassero questo piuttosto scrivendone uno per te. –

risposta

1

gregseth La risposta funzionerà, solo sostituire trim con xargs. È inoltre possibile eliminare il test if utilizzando solo mkdir -p, ad esempio :

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

A rigor di termini il trim o xargs non dovrebbe essere ancora necessaria, ma xargs sarà almeno rimuovere qualsiasi formattazione extra, quindi non fa male.

0

ne dite di questo:

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

Grazie, ma il mio Bash (sono su mac 10.6.2) dice che -bash: trim: comando non trovato Ho provato textutil :: testo ma ho ricevuto la stessa risposta – jrara

1

hai chiesto per uno script specifico, ma se questo è per organizzare la vostra musica, si potrebbe desiderare di controllare EasyTAG. Essa ha regole estremamente specifiche e potenti che è possibile personalizzare per organizzare la tua musica come vuoi:

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

Questa regola dice: "assumere i miei nomi di file sono nella struttura" [artista] - [titolo dell'album]/[numero di traccia] - [titolo] ". Quindi puoi taggarli come tali o spostare i file in qualsiasi nuovo modello o fare praticamente qualsiasi altra cosa

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

programma Python Questo presuppone che i file di origine sono in data e che la nuova struttura di directory devono essere in target (e che già esiste).

Il punto chiave è che os.path.walk attraversa la struttura di directory data e chiama myVisitor per ogni file.

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

Non è necessario l'utilizzo di assetto o xargs:

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

+1 per non utilizzare strumenti esterni – ghostdog74

+0

banda = $ {f% - *}, no? – pra

+0

@pra: Sì, grazie. –

2

con Perl

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