2010-01-31 17 views
5

que tienen cientos de archivos de texto en una carpeta con el nombre que utiliza este tipo de convención de nomenclatura:¿Cómo crear carpetas usando nombres de archivos y luego mover archivos a carpetas?

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

me gustaría crear carpetas para diferentes bandas y se mueven según archivos de texto en estas carpetas. ¿Cómo podría lograr esto usando script bash, perl o python?

+4

Estaría usted dispuesto a escribir un script para hacer esto por sí mismo y publicar aquí? Creo que sería mucho más instructivo si las personas comentaran eso, en lugar de escribir uno para ti. –

Respuesta

1

gregseth la respuesta funcionará, solo reemplace trim con xargs. También puede eliminar la prueba if simplemente usando mkdir -p, por ejemplo :

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

En sentido estricto la trim o xargs ni siquiera debería ser necesario, pero xargs habrá al menos eliminar cualquier formato extra, por lo que no se pierde nada.

0

¿Qué tal esto:

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

Gracias, pero mi Bash (estoy en Mac 10.6.2) dice que -bash: trim: comando no encontrado Intenté textutil :: text pero obtuve la misma respuesta – jrara

1

Usted pidió un guión específico, pero si esto es para la organización de su música, es posible que desee echa un vistazo a EasyTAG. Tiene reglas muy específicas y potentes que se pueden personalizar para organizar la música que le apetezca:

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

Esta regla dice, "asumir mis nombres de los archivos se encuentran en la estructura" [artista] - [título del álbum]/[número de pista] - [título] ". Luego puede etiquetarlos como tales, o mover los archivos a cualquier patrón nuevo, o hacer casi cualquier otra cosa.

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

Este programa Python supone que los archivos de origen están en data y que la nueva estructura de directorios deben estar en target (y que ya existe).

El punto clave es que os.path.walk atravesará la estructura de directorio data y llamará al myVisitor para cada archivo.

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

No es necesario el uso de recorte o xargs:

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

+1 por no usar herramientas externas – ghostdog74

+0

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

+0

@pra: Sí, gracias. –

2

con Perl

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