Discussione:
[lungo] batch + SED (lavorare usando le liste)
(troppo vecchio per rispondere)
BIG (Umberto)
2009-06-20 14:13:42 UTC
Permalink
Anzitutto, mi auguro che ci sia ancora qualcuno che legge/scrive, visto che da
parecchio, questo gruppo, una volta fiorente, sembra un deserto dopo un
attacco atomico.

Scenario:
Ho una cartella sul server (linux) [M:\COMUNE\Archivio Macchine\] con
archiviate le macchine costruite nei svariati anni. Sono parecchie centinaia,
una cartella per macchina, con uno o piú livelli di sottocartelle.
Le macchine, negli anni sono state costruite usando diverse tecnologie
elettroniche (diverse marche di PLC e CN).
Ora, molte cartelle contengono anche dei files di documentazione, che sono la
stampa in ascii del software, altrimenti compilato dal PLC o dal CN, che
richiederebbero, in caso di consultazione, per assistenza ai clienti od altro,
la copia della cartella nel mio PC della scrivania (con WINDOWS XP), e l'avvio
dello specifico programma (dipende da marca a marca) e che non permette la
visione completa di tutto il software, ma di solo un blocco alla volta e rende
faticosa la ricerca.
L'uso invece di una stampa ASCII di tutto il software su un file ASCII,
permette di navigare assai velocemente ed avere una visione globale migliore .
Ora, per mia comoditá, ho bisogno di sapere quali cartelle hanno questa
documentazione, e in quali manca, in modo da provvedere.
Dato le diverse tecnologie elettroniche usate, ho pensato di applicare una
ricerca alla volta per ogni tipo di tecnologia.

Per tutto questo ambaradan, mi appoggio alle features del porting in dos del
programma, originario in ambiente *nix, SED.

Primo caso: (che funziona a meraviglia)
Tutte le cartelle del primo tipo di tecnologia in esame, contengono, come file
unico di identificazione, il file PLCE34.KEY.
Il file contenente la documentazione, é un file in testo puro, con
estensione .DOC, non necessariamente con lo stesso nome della cartella in cui
é contenuto...
Creo sul mio PC un file contenente tutte l'elenco di tutte le cartelle
contenenti il file chiave:

cd M:\COMUNE\Archivio Macchine\
dir /b /s M:PLCE34.KEY > c:9034-1
cd C:

Il file 9034-1 contiene una cosa del tipo:

M:\COMUNE\Archivio Macchine\3375\3375.plc\PLCE34.KEY
M:\COMUNE\Archivio Macchine\3240-3243\3240-3243-mod2.plc\PLCE34.KEY
M:\COMUNE\Archivio Macchine\3240-3243\3240-3243-mod1.plc\PLCE34.KEY
M:\COMUNE\Archivio Macchine\3301\3301.PLC\PLCE34.KEY

Ora mi creo un file (9034-3), ordinato per comoditá, contenente nella parte
terminale *.DOC al posto di PLCE34.KEY. Mi creo, per eventuale consultazione
future,un file (9034-2) contenente il solo path.


set FILE=PLCE34.KEY
type 9034-1 | sed "s/%FILE%//" > 9034-2
type 9034-1 | sed "s/%FILE%/*.DOC/" > temp
type temp | sort > 9034-3
del temp
set FILE=


Ora 9034-3 contiene di questa roba:

M:\COMUNE\Archivio Macchine\3246\plc\*.DOC
M:\COMUNE\Archivio Macchine\3257\plc\*.DOC
M:\COMUNE\Archivio Macchine\3258\PLC\*.DOC
M:\COMUNE\Archivio Macchine\3259\plc\*.DOC
M:\COMUNE\Archivio Macchine\3260\plc\*.DOC
M:\COMUNE\Archivio Macchine\3261\plc\*.DOC

A questo punto debbo fare un test se esite o manca un file con estensione .DOC
nella cartella, un qualcosa tipo:

IF EXIST M:\COMUNE\Archivio Macchine\3259\plc\*.DOC <azione>

per tutte le cartelle. SED, mi viene in aiuto, consentendomi di costruire un
file batch che lanciato, appoggiandosi ad un altro batch, di costruire 2
liste, una contenente le cartelle complete (9034-si) ed una quelle incomplete
(9034-no).


@echo off
cls
echo cancellazione files obsoleti
if exist 9034-si del 9034-si
if exist 9034-no del 9034-no
echo creazione file in corso...
echo @echo off > 3.bat
echo cls >> 3.bat
echo if exist 9034-si del 9034-si >> 3.bat
echo if exist 9034-no del 9034-no >> 3.bat
type 9034-3 | sed "s/^M.*/call 4.bat \x22&\x22/" >> 3.bat
echo.
echo File 3.BAT creato!


Ora il batch 3.BAT creato contiene:

@echo off
cls
if exist 9034-si del 9034-si
if exist 9034-no del 9034-no
call 4.bat "M:\COMUNE\Archivio Macchine\3246\plc\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3257\plc\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3258\PLC\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3259\plc\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3260\plc\*.DOC"
call 4.bat "M:\COMUNE\Archivio Macchine\3261\plc\*.DOC"


ed il batch di ausilio 4.BAT contiene:

@echo off
if exist %1 goto yes
if not exist %1 goto no
goto fine
:yes
dir /b /s %1 >> 9034-si
dir /b /s %1 | sed "s/\x22//g"
goto fine
:no
echo %1 | sed "s/\x22//g" | sed "s/*.DOC//" >> 9034-no
:fine


Il risultato é:

9034-si (macchine con documentazione completa)

M:\COMUNE\Archivio Macchine\3207\3207.plc\PLC-D.DOC
M:\COMUNE\Archivio Macchine\3213\PLC.PLC\CINA.DOC
M:\COMUNE\Archivio Macchine\3214\PLC14.PLC\CINA.DOC
M:\COMUNE\Archivio Macchine\3215\PLC15.PLC\CINA.DOC


9034-no (macchine con documentazione da fare)

M:\COMUNE\Archivio Macchine\3278\Plc\
M:\COMUNE\Archivio Macchine\3286\Plc\
M:\COMUNE\Archivio Macchine\3302\3302.plc\
M:\COMUNE\Archivio Macchine\3304\3304.plc\
M:\COMUNE\Archivio Macchine\3306\3306.plc\


--------------------------------------------------------

Ora passiamo alle macchine con il secondo tipo di tecnologia, e che, seguendo
la traccia di cui sopra, non riesco a fare funzionare.

Il file di firma del tipo di tecnologia, é un file con nomi vari, ma con
estensione .XPJ e la documentaxione, sempre su un file ascii, é un file con
estensione .DOC in alcuni casi ed il altri un file SENZA estensione.

Partiamo, supponendo che il file di documentazione sia di tipo .DOC!

Creo la solita lista iniziale:

cd M:\COMUNE\Archivio Macchine\
dir /b /s M:*.XPJ > c:9034-1
cd C:

Il file 9034-1 contiene una cosa del tipo:

M:\COMUNE\Archivio Macchine\temp\3526_PLC.MCH\3526.XPJ
M:\COMUNE\Archivio Macchine\3386\SACC_PLC.MCH\3386.XPJ
M:\COMUNE\Archivio Macchine\3386\SACCA_CN.MCH\STAMPA.XPJ

creo un file 9034-3 con le seguenti istruzioni:

set FILE=*.XPJ
echo Creazione files...
type 9034-1 | sed -e "s/%FILE%/*.DOC/" > temp
type temp | sort > 9034-3
del temp
set FILE=

... ma il risultato non va.

Debbo trovare il modo di cancellare il nome del file, lasciando il solo path ed
aggiungere alla fine il *.DOC, oppure *. nel caso di files senza estensione.
Debbo quindi riuscire a troncare il nome del file dal path.

... E quí chiedo l'aiuto ...

P.S. asterisco e punto, sono espansi nella riga di comando del programma SED,
come <tutti i caratteri>...



For my real address use the X-SPAM header
--
+---------------------------------------------------------------------------+
| Velocita' e alcool uccidono. Fatti una pera che e' meglio. |
| |
+-----#11--------------------Campagna contro le pubblicita` idiote.---------+
gioacchino
2009-06-20 16:42:19 UTC
Permalink
Post by BIG (Umberto)
M:\COMUNE\Archivio Macchine\temp\3526_PLC.MCH\3526.XPJ
M:\COMUNE\Archivio Macchine\3386\SACC_PLC.MCH\3386.XPJ
M:\COMUNE\Archivio Macchine\3386\SACCA_CN.MCH\STAMPA.XPJ
Debbo trovare il modo di cancellare il nome del file, lasciando il solo
path ed aggiungere alla fine il *.DOC, oppure *. nel caso di files senza
estensione. Debbo quindi riuscire a troncare il nome del file dal path.
... E quí chiedo l'aiuto ...
Prova a passare a SED la seguente espressione regolare:
s/\\[^\]*$/:DOC/

Ciao
gioacchino
2009-06-20 16:44:45 UTC
Permalink
Prova a passare a SED la seguente espressione regolare: s/\\[^\]*$/:DOC/
Ho fatto un errore di digitazione, nella ER al posto del due punti il
punto ovviamente...
BIG (Umberto)
2009-06-21 08:30:45 UTC
Permalink
gioacchino in data Saturday 20 June 2009 18:44, nel gruppo it.comp.os.dos ha
Prova a passare a SED la seguente espressione regolare: s/\\[^\]*$/:DOC/
Ok per il "2 punti" errato, corretto...
Ma non funzia, dice che il processo ha tentato di scrivere in una pipe
inesistente, e restituisce un file vuoto.
In finestra dos ho usato:
type 9034-1 | sed "s/\\[^\]*$/.DOC/" > 9034-3

Provato il comando anche sul pinguino, ma c'é un errore.
cat 9034-1 | sed 's/\\[^\]*$/.DOC/'
mi stampa il file originario, con in fondo un ".DOC" sbagliato.
Corretta la tua stinga in:
cat 9034-1 | sed 's/\\[^\]*$/\\\*.DOC/'
e funziona.
Resta il fatto che il porting su dos che ho io, (chissá a quale versione di sed
si sono ispirati..) a quanto pare, non é perfetto e non va come dovrebbe.

Cerco, sperando di trovarla, un'altra versione, spero migliore..

In pratica debbo trasformare:
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\PRG3294.XPJ
in
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\*.DOC
ed in
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\*.

P.S. Non ho ben capito la prima parte della stringa che mi hai dato il
\[^\]*$
vorrebbe dire di trovare l'ultimo \ ?


For my real address use the X-SPAM header
--
+---------------------------------------------------------------------------+
|I puristi ritengono inopportuno utilizzare driver proprietari sutto Linux, |
|i masochisti amano utilizzare driver Windows sotto Linux... Twisted Evil |
+-----#19--------------------Campagna contro le pubblicita` idiote.---------+
gioacchino
2009-06-21 17:52:44 UTC
Permalink
cat 9034-1 | sed 's/\\[^\]*$/\\\*.DOC/' e funziona.
Infatti.
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\PRG3294.XPJ in
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\*.DOC ed in
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\*.
Lo fa sicuramente in linux, prova in dos ad eliminare il raddoppio del
carattere \ che è anche il carattere di escape nelle ER, da così:
s/\\[^\]*$/\\\*.DOC/
a così:
s/\[^\]*$/\*.DOC/
P.S. Non ho ben capito la prima parte della stringa che mi hai dato il
\[^\]*$
vorrebbe dire di trovare l'ultimo \ ?
Certo, letteralmente dice di cercare una stringa che finisce con una \ e
che prosegue con una serie di caratteri qualsiasi escluso proprio \
L'intera espressione quindi gli dice di sostituire tutto quello che c'è
dall'ultima barra in poi che in fin dei conti è il nome del file con
\*.DOC
BIG (Umberto)
2009-06-26 17:26:51 UTC
Permalink
gioacchino in data Sunday 21 June 2009 19:52, nel gruppo it.comp.os.dos ha
Post by gioacchino
Lo fa sicuramente in linux, prova in dos ad eliminare il raddoppio del
s/\\[^\]*$/\\\*.DOC/
s/\[^\]*$/\*.DOC/
Funziona anche col SED in dos!
Solo che bisogna mettere anche tra le parentesi quadre, la doppia \\, ossia:
s/\\[^\\]*$/\\\*.DOC/

P.S. ero via per lavoro ed ho provato solo ieri sera...

Complimenti per il suggerimento.


For my real address use the X-SPAM header
--
+---------------------------------------------------------------------------+
| Informazioni traffico 899 04 21 21 |
| |
+-----#14--------------------Campagna contro le pubblicita` idiote.---------+
gioacchino
2009-06-26 17:50:09 UTC
Permalink
Post by BIG (Umberto)
Funziona anche col SED in dos!
Solo che bisogna mettere anche tra le parentesi quadre, la doppia \\,
ossia: s/\\[^\\]*$/\\\*.DOC/
P.S. ero via per lavoro ed ho provato solo ieri sera...
Complimenti per il suggerimento.
Ciao, alla prossima.
orpy
2010-01-08 23:26:45 UTC
Permalink
BIG (Umberto) wrote:
[...]
Post by BIG (Umberto)
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\PRG3294.XPJ
in
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\*.DOC
ed in
M:\COMUNE\Archivio Macchine\3294\PLC3294.MCH\*.
mi rendo conto che il post è vecchio, ma...

prova a guardare l'help del comando FOR , da prompt dei comandi, da win2000
in poi (quindi anche XP)

e la gestione delle variabili... ci sono un sacco di bei trucchettini :-)

davvero, non sto sparando a caso ;-))

Continua a leggere su narkive:
Loading...