[script] unire video da file di elenco

22 risposte [Ultimo messaggio]
Ritratto di doc_pluto
doc_pluto
(Guru)
Offline
Guru
Iscritto: 08/02/2007
Messaggi: 871

dunque, c'ho provato tutta la sera, ma nulla.

ho un file di testo tipo questo

Video_n1_1aParte
Video_n1_2aParte
Video_n2_1aParte
Video_n2_2aParte
Video_n3_1aParte
Video_n3_2aParte
...
...
...

vorrei passare a due a due le righe a

mencoder -oac copy -ovc copy Video_nX_1aParte Video_nX_2aParte -o Video_nX

avete suggerimenti?

Hardware: MB:P5E3_Deluxe - CPU:Core2Duo E8400 3.0GHz - RAM:Kingstone_2Gb_DDR3 - Video:GeForce9600GT/PCI/SSE2 - HD: 2x WDCaviarBlue 1TB
--------------------------------
Software: SO:openSuSE 12.1 - ARCH:64bit - DE:Gnome3 - DriverVideo:Ufficiali Nvidia

Ritratto di Gollum
Gollum
(Collaboratore)
Offline
Collaboratore
Iscritto: 03/03/2005
Messaggi: 802

  1 #! /bin /bash
  2 
  3 for file in "$@"
  4         do
  5                 echo mencoder -oac copy -ovc copy $1 $2 -o Video_nX
  6                 shift 2
  7                 if  [[ -z $1 && -z $2 ]]
  8                 then    
  9                         exit
 10                 fi      
 11 done

Salva prima lo script in un file, poi quando lo avii ricordati di aggiungere i nomi dei file, a coppia o anche tutti insieme, nel terminale.

sh nomescript.sh Video_n1_1aParte Video_n1_2aParte Video_n2_1aParte Video_n2_2aParte Video_n3_1aParte Video_n3_2aParte

Fammi sapere se funziona Wink

Desktop DELL XPS8100 => openSUSE_12.2 => KDE 4.10 => Core i7 => 3.4.28-2.20 => Nvidia GT220
Notebook Sony Vaio VPPCA =>openSUSE_12.2 => KDE 4.10 => Core i5 => 3.4.28-2.20 => AMD HD 6470M

Ritratto di doc_pluto
doc_pluto
(Guru)
Offline
Guru
Iscritto: 08/02/2007
Messaggi: 871

grazie del suggerimento..
invece per farglieli leggere da un file di testo?

un paio di domandine su questo scriptino:
$@ cosa significa?
if  [[ -z $1 && -z $2 ]] su cosa fa il controllo? perchè la doppia quadra? -z?

vorrei ottenere il nome del video in output tagliando il nome dei primi due. devo smanettare con sed?

Hardware: MB:P5E3_Deluxe - CPU:Core2Duo E8400 3.0GHz - RAM:Kingstone_2Gb_DDR3 - Video:GeForce9600GT/PCI/SSE2 - HD: 2x WDCaviarBlue 1TB
--------------------------------
Software: SO:openSuSE 12.1 - ARCH:64bit - DE:Gnome3 - DriverVideo:Ufficiali Nvidia

Ritratto di Gollum
Gollum
(Collaboratore)
Offline
Collaboratore
Iscritto: 03/03/2005
Messaggi: 802

Attenzione ai doppi apici

$@

legge tutti gli argomenti passati alla riga di comando come una sola stringa.

"$@"
legge tutti gli argomenti passati, considerandoli però come stringhe separte preservando gli spazi all'interno di ogni singolo argomento.

 if [[ -z $1 && -z $2 ]
 

Questo test controlla tramite il flag -z che gli argomenti $1 e $2 non siano nulli, ovvero devono contenere dei caratteri perchè il ciclo for possa iterare, altrimenti termina. Ciò accade quando "$@" non passa più argomenti alle varibili [$1] e [$2] che al momento el test risulteranno nulle. La doppia quadra serve per inserire due test all'interno di un solo blocco altrimenti dovresti scrivere
if [ -z $1 ] && [ -z $2 ]

 shift

Si occupa di traslare la posizione degli argomenti $1 e $2 di due posizioni rispetto agli argomenti passati a "$@".

Aspetta che vò a fare colazione Wink

Desktop DELL XPS8100 => openSUSE_12.2 => KDE 4.10 => Core i7 => 3.4.28-2.20 => Nvidia GT220
Notebook Sony Vaio VPPCA =>openSUSE_12.2 => KDE 4.10 => Core i5 => 3.4.28-2.20 => AMD HD 6470M

Ritratto di Gollum
Gollum
(Collaboratore)
Offline
Collaboratore
Iscritto: 03/03/2005
Messaggi: 802

doc_pluto ha scritto:


vorrei ottenere il nome del video in output tagliando il nome dei primi due. devo smanettare con sed?

Sed è lo strumento che può fare al caso tuo, non è che non sono un mago ma se mi dici dove li vuoi tagliare posso provare a drti un mano.
Alrimenti un'altra soluzione possibile potrebbe essre quella di inserire il nome direttamente da terminale tramite il comendo read e, modificando lo script così

 1 #! /bin /bash
 2 
 3 for file in "$@"
 4         do      
 5                 echo "Che nome vuoi dare al file?"
 6                 read REPLY
 7                 # Modificare il nome del file in output
 8                 echo mencoder -oac copy -ovc copy $1 $2 -o $REPLY
 9                 shift 2
 10                 if  [[ -z $1 && -z $2 ]]
 11                 then
 12                         exit
 13                 fi
 22 done    

Desktop DELL XPS8100 => openSUSE_12.2 => KDE 4.10 => Core i7 => 3.4.28-2.20 => Nvidia GT220
Notebook Sony Vaio VPPCA =>openSUSE_12.2 => KDE 4.10 => Core i5 => 3.4.28-2.20 => AMD HD 6470M

Ritratto di doc_pluto
doc_pluto
(Guru)
Offline
Guru
Iscritto: 08/02/2007
Messaggi: 871

Gollum ha scritto:

doc_pluto ha scritto:


vorrei ottenere il nome del video in output tagliando il nome dei primi due. devo smanettare con sed?

Sed è lo strumento che può fare al caso tuo, non è che non sono un mago ma se mi dici dove li vuoi tagliare posso provare a drti un mano.
Alrimenti un'altra soluzione possibile potrebbe essre quella di inserire il nome direttamente da terminale tramite il comendo read e, modificando lo script così

 1 #! /bin /bash
 2 
 3 for file in "$@"
 4         do      
 5                 echo "Che nome vuoi dare al file?"
 6                 read REPLY
 7                 # Modificare il nome del file in output
 8                 echo mencoder -oac copy -ovc copy $1 $2 -o $REPLY
 9                 shift 2
 10                 if  [[ -z $1 && -z $2 ]]
 11                 then
 12                         exit
 13                 fi
 22 done    

fico.
stavo per chiederti se quell'IF non andasse prima di mencoder per l'unione, ma invece mi sembra di aver capito che controlla i successivi due elementi rispetto a quelli appena usati da mencoder, giusto?

generalmente i file video che ho sono del tipo Titolo.del.video.1°Tempo.est e Titolo.del.video.2°Tempo.est da unire in Titolo.del.video.est

edit: una cosa che non avevo notato
perchè echo prima di mencoder?

Hardware: MB:P5E3_Deluxe - CPU:Core2Duo E8400 3.0GHz - RAM:Kingstone_2Gb_DDR3 - Video:GeForce9600GT/PCI/SSE2 - HD: 2x WDCaviarBlue 1TB
--------------------------------
Software: SO:openSuSE 12.1 - ARCH:64bit - DE:Gnome3 - DriverVideo:Ufficiali Nvidia

Ritratto di Gollum
Gollum
(Collaboratore)
Offline
Collaboratore
Iscritto: 03/03/2005
Messaggi: 802

doc_pluto ha scritto:

perchè echo prima di mencoder?


L'ho inserito solo per testare il funzionamento del ciclo, per far lavorare mencoder devi toglierlo. È una precauzione che di solito si prende quando si fanno gli script in questo modo si evita di fare "danni" con la shell.
doc_pluto ha scritto:

stavo per chiederti se quell'IF non andasse prima di mencoder per l'unione

Il flag -z valuta che all'interno delle varibili posizionali $1 e $2 vi siano contenuti dei caratteri. Questo determina la veridicità della condizione if che termina il ciclo qualora quest' ultime riultano vuote. Ovvero quando non ci sono più nomi da leggere.

La soluzione con il comando read ti piace oppure voui intraprendere la via di sed ? Wink

Desktop DELL XPS8100 => openSUSE_12.2 => KDE 4.10 => Core i7 => 3.4.28-2.20 => Nvidia GT220
Notebook Sony Vaio VPPCA =>openSUSE_12.2 => KDE 4.10 => Core i5 => 3.4.28-2.20 => AMD HD 6470M

Ritratto di aksaf
aksaf
(Guru)
Offline
Guru
Iscritto: 08/03/2011
Messaggi: 957

Scusate intromissione, ma non basta dare:

mencoder -oac copy -ovc copy Video_nX_1aParte Video_nX_2aParte Video_nX_3aParte <elenco ordinato file da unire> -o Video_nX

?

Inoltre forse serve anche aggiungere l'opzione -idx.

Ritratto di doc_pluto
doc_pluto
(Guru)
Offline
Guru
Iscritto: 08/02/2007
Messaggi: 871

Gollum ha scritto:

La soluzione con il comando read ti piace oppure voui intraprendere la via di sed ? Wink

per quanto l'inserimento del nome del file da tastiera mi sia stato d'aiuto per capire meglio certe cose, risulta scomodo lavorando da file, perchè non rende automatico il processo.
se ti va di darmi una mano, proverei sed, anche per capire bene come funziona, perchè io oltre

n=$(echo $fname | sed -e "s/ - /_/g" | sed -e "s/ /./g")

non vado.
ma, la lettura da file così funziona?

aksaf ha scritto:

Scusate intromissione, ma non basta dare:

mencoder -oac copy -ovc copy Video_nX_1aParte Video_nX_2aParte Video_nX_3aParte <elenco ordinato file da unire> -o Video_nX

?
Inoltre forse serve anche aggiungere l'opzione -idx.


non è sufficiente, perchè i video sono divisi in due, e quindi vanno uniti a due a due.

Hardware: MB:P5E3_Deluxe - CPU:Core2Duo E8400 3.0GHz - RAM:Kingstone_2Gb_DDR3 - Video:GeForce9600GT/PCI/SSE2 - HD: 2x WDCaviarBlue 1TB
--------------------------------
Software: SO:openSuSE 12.1 - ARCH:64bit - DE:Gnome3 - DriverVideo:Ufficiali Nvidia

Ritratto di Gollum
Gollum
(Collaboratore)
Offline
Collaboratore
Iscritto: 03/03/2005
Messaggi: 802

doc_pluto ha scritto:

se ti va di darmi una mano, proverei sed, anche per capire bene come funziona, perchè io oltre non vado


Finchè sono in grado volentieri così ti piace?
sed -e 's/Parte//;s/a//;s/[0-9]//g;s/_n_//'

Ciao Aksaf Wave

Desktop DELL XPS8100 => openSUSE_12.2 => KDE 4.10 => Core i7 => 3.4.28-2.20 => Nvidia GT220
Notebook Sony Vaio VPPCA =>openSUSE_12.2 => KDE 4.10 => Core i5 => 3.4.28-2.20 => AMD HD 6470M

Ritratto di Gollum
Gollum
(Collaboratore)
Offline
Collaboratore
Iscritto: 03/03/2005
Messaggi: 802

Riscrivo lo script

#! /bin/bash
 
1 for file in "$@"
2         do
3                
4                 # Modificare il nome del file in output
5                 # dal comando sed 
6                 out=$(echo $file | sed -e 's/Parte//;s/a//;s/[0-9]//g;s/_n_//')
7                 echo mencoder -oac copy -ovc copy $1 $2 -o $out
8                 
9                  shift 2
10                 if  [[ -z $1 && -z $2 ]]
11                 then
12                         exit
13                 fi      
14 done            
 
 

Desktop DELL XPS8100 => openSUSE_12.2 => KDE 4.10 => Core i7 => 3.4.28-2.20 => Nvidia GT220
Notebook Sony Vaio VPPCA =>openSUSE_12.2 => KDE 4.10 => Core i5 => 3.4.28-2.20 => AMD HD 6470M