Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 7 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Menor
Forista Menor
Avatar de Usuario

Registrado: Dom Oct 19, 2008 11:00 pm
Mensajes: 90

Nota Publicado: Sab Sep 04, 2010 9:35 am 
Arriba  
Hola, buenas tardes a todos/as.

El comando split permite cortar archivos en varios trozos con el tamaño deseado. Ejecutando:

Código:
$ split -b 100M -d -a 3 [nombre_archivo_a_cortar].avi  [nombre_base_de_los_trozos].avi.


me crea trozos de 100 MB de tamaño de la siguiente manera:

Citar:
[nombre_base_de_los_trozos].avi.000
[nombre_base_de_los_trozos].avi.001
[nombre_base_de_los_trozos].avi.002
etc. .........


Me he dado cuenta que esos trozos pueden ser unidos en otros sistemas operativos, pero para ello hay que renumerar las extensiones de los trozos comenzando por *.001 en vez de *.000. Si son pocos trozos se hace manualmente y listo, pero si fuesen muchos, ¿se podría realizar automáticamente con un script o línea de comandos?

Muchas gracias por adelantado.

Salud.

P.D.: vaya por d10$... Ahora me entero que con la aplicación windowsera Cortune es posible unir los trozos sin necesidad de renumerarlos...


Última edición por elmohino el Mar Sep 07, 2010 4:26 am, editado 2 veces en total
 Perfil  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Sab Oct 09, 2004 11:00 pm
Mensajes: 1299

Nota Publicado: Sab Sep 04, 2010 10:04 am 
Arriba  
Hecho al vuelo y sujeto a (muchas) correcciones. Pero te sirve para empezar:

#para tomar el nombre base
read -p "nombre base: " BASE
#renombro primero para que no sobreescriba archivos
for i in `ls $BASE*`; do mv $i $i.b; done
#Ahora renombro el cero, y luego del 1 al 9, y del 10 al 100 (esto es una chapuza, pero es lo que se me ocurre rápidamente).
mv $BASE.000.b $BASE.001
for i in `seq 2 9`; do mv $BASE.00$i.b $BASE.00$i; done
for i in `seq 10 100`; do mv $BASE.009.b $BASE.00$i; done
exit

PD: de todos modos, si te refieres a Windows, no hace falta renombrar los archivos para unirlos. Usa el comando copy /b archivo.000 archivo.0001 etc.

 Perfil  

Desconectado
Forista Menor
Forista Menor
Avatar de Usuario

Registrado: Dom Oct 19, 2008 11:00 pm
Mensajes: 90

Nota Publicado: Sab Sep 04, 2010 2:34 pm 
Arriba  
Gracias por el script, amigo.

De momento no funciona: renumera a *.001 la parte *.000, pero la que debería rumerarse con *.002 cambia a *.001.b y el resto inalterables.

Creo que la clave está en las siguientes líneas:
Código:
for i in `seq 2 9`; do mv $BASE.00$i.b $BASE.00$i; done
for i in `seq 10 100`; do mv $BASE.009.b $BASE.00$i; done


pero yo no llego a saber dónde hay que modificar.

Salud.

PD: sí, me estoy refiriendo a Windows. Y como es para enviárselo a personas con conocimientos casi nulos del uso de comandos, es mejor renumerar como indico para que puedan esas personas unir los archivos con soluciones gráficas (HJ-Split, FSJ, Hacha Pro, etc.)

PD: la línea de comandos correcta para unir trozos en Güíndows no es exactamente como Vd. la expone, sino:

Código:
copy /b archivo.000+archivo.001+archivo.002 ..... nombre_archivo_destino


Editado -- 04 Sep 2010, 23:34 --

Se me ha ocurrido que también se podría, en vez de sustituir, añadir las extensiones y después, con algún comando tipo sed o awk, quitar lo sobrante. Pero claro, hay que saber hacerlo...


Última edición por elmohino el Mar Sep 07, 2010 4:23 am, editado 1 vez en total
 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1361
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Sab Sep 04, 2010 2:45 pm 
Arriba  
Código:
for i in `seq 2 9`; do j=(( $i + 1 )); mv $BASE.00$i.b $BASE.00$j; done

creo que utilizas el mismo indice a la hora de mover los archivos.

De todas formas habría que considerar evitar el primer renombrado. En principio bastaría con empezar desde el último elemento. Podrías intentar algo como:
Código:
for i in `seq -w 3 100 1`; do j=(( $i + 1 )); mv $BASE.$i $BASE.$j; done

No sé si funcionará o no, pero haz unas pruebas por si acaso.

Si te falla algo por los ceros del principio (que no te salga algo como 001 sino simplemente 1) puedes echar un vistazo al siguiente enlace:
http://jonathanwagner.net/2007/04/zero-padding-in-bash/

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Menor
Forista Menor
Avatar de Usuario

Registrado: Dom Oct 19, 2008 11:00 pm
Mensajes: 90

Nota Publicado: Sab Sep 04, 2010 3:55 pm 
Arriba  
Gracias por su respuesta, pero se produce un error:

Código:
./remu: línea 6: error sintáctico cerca del elemento inesperado `('
./remu: línea 6: `for i in `seq -w 3 100 1`; do j=(( $i + 1 )); mv $BASE.$i $BASE.$j; done'


Salud.

 Perfil  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Sab Oct 09, 2004 11:00 pm
Mensajes: 1299

Nota Publicado: Sab Sep 04, 2010 4:19 pm 
Arriba  
Sí, la falla es la que señala akodo. Y de todos modos, la idea que tira es mejor. No ando con tiempo como para detenerme a probar, pero sería así. Elmohino: de nuevo va un borrador, y de paso aprendes.

#!/bin/bash -x
#tomas el nombre base (podría hacerse con basename, si lo quieres más refinado).
read -p "nombre base : " BASE
#cuentas la cantidad de archivos que responden al patrón y lo envías a un archivo de texto
ls $BASE.*|wc -l > numero
# esa cantidad va a una variable. Este paso y el anterior se simplifican uniendo todo mediante el uso del comando tempfile. Pero a mí, al menos, a veces me falla en la creación de la variable. Por eso uso este método poco ortodoxo.
NUM=`cat numero`
#Acá empieza el renombrado, de atrás hacia adelante, sumándole uno al nombre, y restándole uno a la variable.
for i in `seq 1 $NUM`; do
mv $BASE.`expr $NUM - 1` $BASE.`printf "%02d" $NUM` && NUM=`expr $NUM - 1` ; done


PD: y análisis rápido de lo que acabas de postear (no estaba cuando escribí lo de arriba). Me parece que falta una comilla simple para cerrar el comando. Si puedo más tarde armo el script completo. Pero con esto ya tienes para entretenerte.

Edit: listo, creo que así tiene que andar.

 Perfil  

Desconectado
Forista Menor
Forista Menor
Avatar de Usuario

Registrado: Dom Oct 19, 2008 11:00 pm
Mensajes: 90

Nota Publicado: Dom Sep 05, 2010 5:15 am 
Arriba  
He sustituido la última línea:

Código:
mv $BASE.`expr $NUM - 1` $BASE.`printf "%02d" $NUM` && NUM=`expr $NUM - 1` ; done


por ésta (añadiéndole dos ceros):

Código:
mv $BASE.0*`expr $NUM - 1` $BASE.0`printf "%02d" $NUM` && NUM=`expr $NUM - 1` ; done


Con ello consigo que se renumeren los archivos como es deseado si no hay más de 10. Pero cuando hay más de 10, esto es lo que pasa:

Código:
usuario@usuario-desktop:~/Escritorio/aaa$ ./rem
+ read -p 'nombre base : ' BASE
nombre base : patos.flv
+ wc -l
+ ls patos.flv.000 patos.flv.001 patos.flv.002 patos.flv.003 patos.flv.004 patos.flv.005 patos.flv.006 patos.flv.007 patos.flv.008 patos.flv.009 patos.flv.010 patos.flv.011 patos.flv.012 patos.flv.013 patos.flv.014 patos.flv.015
++ cat numero
+ NUM=16
++ seq 1 16
+ for i in '`seq 1 $NUM`'
++ expr 16 - 1
++ printf %02d 16
+ mv patos.flv.015 patos.flv.016
++ expr 16 - 1
+ NUM=15
+ for i in '`seq 1 $NUM`'
++ expr 15 - 1
++ printf %02d 15
+ mv patos.flv.014 patos.flv.015
++ expr 15 - 1
+ NUM=14
+ for i in '`seq 1 $NUM`'
++ expr 14 - 1
++ printf %02d 14
+ mv patos.flv.013 patos.flv.014
++ expr 14 - 1
+ NUM=13
+ for i in '`seq 1 $NUM`'
++ expr 13 - 1
++ printf %02d 13
+ mv patos.flv.012 patos.flv.013
++ expr 13 - 1
+ NUM=12
+ for i in '`seq 1 $NUM`'
++ expr 12 - 1
++ printf %02d 12
+ mv patos.flv.011 patos.flv.012
++ expr 12 - 1
+ NUM=11
+ for i in '`seq 1 $NUM`'
++ expr 11 - 1
++ printf %02d 11
+ mv patos.flv.010 patos.flv.011
++ expr 11 - 1
+ NUM=10
+ for i in '`seq 1 $NUM`'
++ expr 10 - 1
++ printf %02d 10
+ mv patos.flv.009 patos.flv.010
++ expr 10 - 1
+ NUM=9
+ for i in '`seq 1 $NUM`'
++ expr 9 - 1
++ printf %02d 9
+ mv patos.flv.008 patos.flv.009
++ expr 9 - 1
+ NUM=8
+ for i in '`seq 1 $NUM`'
++ expr 8 - 1
++ printf %02d 8
+ mv patos.flv.007 patos.flv.008
++ expr 8 - 1
+ NUM=7
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
+ for i in '`seq 1 $NUM`'
++ expr 7 - 1
++ printf %02d 7
+ mv patos.flv.006 patos.flv.016 patos.flv.007
mv: el destino, «patos.flv.007», no es un directorio
usuario@usuario-desktop:~/Escritorio/aaa$


Es lógico. Se encuentra con dos archivos que terminan de la misma manera. ¿Cómo se podría hacer para que distinga?

Salud.

Editado -- 05 Sep 2010, 14:15 --

Bueno. Al final me han dado una pista que creo que soluciona el tema: se le indica al script que cree un subdirectorio y que vaya moviendo los archivos renumerados a ese subdirectorio, y así no hay conflicto:

Código:
#!/bin/bash

read -p "Introducir nombre base de los archivos: " BASE

# Contar la cantidad de archivos que responden al patrón y enviarla a un archivo de texto
ls $BASE.*|wc -l > numero

mkdir $BASE-renumerados

NUM=`cat numero`

# Comenzar renumerado, de atrás hacia adelante, sumándole uno al nombre, y restándole uno a la variable
for i in `seq 100 $NUM`; do
mv $BASE.*`expr $NUM - 1` $BASE-renumerados/$BASE.`printf "%02d" $NUM` && NUM=`expr $NUM - 1` ; done
for i in `seq 1 $NUM`; do
mv $BASE.0*`expr $NUM - 1` $BASE-renumerados/$BASE.0`printf "%02d" $NUM` && NUM=`expr $NUM - 1` ; done

rm numero


Me parece que el tema queda solucionado. Muchas gracias de nuevo, caballeros, por su inestimable ayuda.

Salud.

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 7 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO