Newsgroup: it.comp.os.linux.iniziare
Titolo: comando "stat" in pipe ... è possibile?

é possibile inviare in pipe al comando "stat" una lista di file di cui
si vogliono conoscere le proprietà?
Es:
stat --printf "%x\n" `cat tst/fs`
in cui il file "fs" presente nella directory "tst" è un file di testo
con il seguente contenuto
tst/f1
tst/f2
tst/f3
il comando di cui sopra mi fornisce, come desidero, le date dei file f1,
f2, f3 tuttavia ha un inconveniente il `` espande la lista e se la lista
è troppo grande il comando non verrà eseguito o avrà problemi!!
Quindi sarebbe desiderabile usare una pipe ...
Grazie in anticipo

Nando67 wrote:

xargs stat --printf "%x\n" < tst/fs
-- 
Cio' che si vede, e'.

 
Domanda generica:
è identico usare la pipe invece della redirezione dello std in?
nel caso presente
cat tst/fs | xargs stat --printf "%x\n"



Beh ai fini pratici e' lo stesso, pero' i puristi ti obietteranno che e' un
UUOC (Useless Use Of Cat), che consumi un processo extra per niente,
etc.etc.etc.
Tu non ascoltarli e fai come ti pare.


 In realtà cambia moltissimo
Si', nel tuo esempio. Nel suo, cambia molto poco.


 Si', nel tuo esempio. Nel suo, cambia molto poco.
1)  Esistono molti comandi sensibili per cui il caso in cui 
  cambia niente è il caso particolare.
2)  Appena il comando si fa più complesso anche xargs dà 
   problemi (il while è il caso meno problematico, credimi)
3)  Non vorrai che l'opener usi sempre comandi molto semplici
  o che impegnano poche risorse.
4)  Alcuni dicono che cat è più leggibile: sai che la redirezione 
  si può mettere dovunque?



wrote:

Guarda che io nel mio codice originale ho usato la ridirezione, e la uso
dove possibile.
Per l'OP: ecco un ottimo esempio di quello di cui ti parlavo.


 etc.etc.etc.
Una risposta corretta sarebbe stata:
| In questo caso particolare ai fini pratici è lo stesso però in molti casi
| molto frequenti usare cat con la redirezione può produrre risultati molto
| diversi ed errori difficili da risolvere per un principiante.
Stai diventando più noioso di Voyager.

 che non è così, 
*PLONK*
Yawn.


 ... usare un pipe con un pipe ..
Leggi:
usare cat in una pipe

    problemi (il while è il caso meno problematico, credimi)
qui mi stai infrangendo un mito!
Pensavo che la cosa migliore per coloro che scrivono comandi shell era
quella di scriverli in una sola riga, quello che tu stai proponendo è
invece avvicinarsi alla "programmazione" usando i suoi classici
costrutti, cicli while, for etc
Domanda generale/generalista:
In base a quanto dici quindi, anche se si riesce a fare un comando in
una sola riga (e questo è un indubio piacere estetico) è sempre meglio
tradurlo in una sequenza di comandi più piccoli?
E poi, cosa significa che anche xargs può avere problemi?
Ad esempio se il file "tst/fs" ha migliaia di righe posso avere dei
problemi?
Grazie

 quella di scriverli in una sola riga,
Ogni limite ha una riga. ;)))
Non puoi costruire "righe" di lunghezza arbitraria, insomma.
Trovi in proposito anche leggendo il man di xargs.
Ah, butta un occhio alla prima opzione. :)
-- 
Bye, Lem

 Ah, butta un occhio alla prima opzione. :)
La prima opzione di xargs è la seguente:
"-a file
              Read  items from file instead of standard input.  If you
use this option, stdin remains unchanged when com‐
              mands are run.  Otherwise, stdin is redirected from
/dev/null."
mi devi scusare ma non capisco come si lega con la tua considerazione,
forse intendevi la seconda opzione con insieme la "Description"
"--null
       -0     Input items are terminated by a null character instead of
by whitespace, and the quotes and  backslash  are
              not  special  (every character is taken literally).
Disables the end of file string, which is treated like
              any other argument.  Useful when input items might contain
white space, quote marks, or  backslashes.   The
              GNU find -print0 option produces input suitable for this
mode."
Ciò di cui mi stai mettendo in guardia è che se ho nomi di file che
contengono spazi, xargs non si comporterà come desidero?
Nel caso specifico non ho questo problema i nomi dei file sono ben
definiti, senza spazi e di lunghezza costante, cmq hai fatto bene a
segnalarmi questa cosa può essere utile in altre situazioni.
Grazie

 segnalarmi questa cosa può essere utile in altre situazioni.
Si', se i nomi di file hanno spazi, apici e backslash, xargs li interpreta
come separatori o simboli di quoting e quindi non funziona correttamente.
E' uno dei problemi di xargs. Usando -0, xargs usa solo NUL come separatore,
quindi i nomi possono essere arbitrari. Questo ovviamente presuppone che
l'input di xargs contenga i nomi separati da NUL, quindi nel caso del tuo
file "-0" non funzionerebbe, perche' i nomi sono separati da \n.
Se invece i nomi provengono dall'output di un altro programma (per esempio
find), probabilmente quel programma ha un'opzione per separare i nomi nel
suo output con NUL anziche' newlines (-print0 nel caso di find).


 
oppure ad esempio il comando stat
stat --prinff "%n-%x\0" <nome file>

 problemi?
Ti hanno parzialmente risposto. Però il problema del mio esempio non 
riguardava il while ma l'uso di variabili nella subshell. Ho fatto l'esempio 
con while ma potevo usare xargs, grep o qualsiasi altro comando ed 
era la stessa cosa. E ciò non toglie che while, xargs, grep e molti alti 
programmi hanno le loro pecche e le loro stranezze.