Newsgroup: it.comp.os.linux.iniziare
Titolo: script bash

come si usa cp con una pipe?
ho un file contenente un elenco di file, vorrei fare una cosa del tipo
cat file | cp <dest dir>
non riesco a trovare la sintassi corretta.
-- 
                     Dona i tuoi cicli di clock alla ricerca!
 
http://boinc.berkeley.edu/
                          --------------------
                            Salta chi zompa!

 non riesco a trovare la sintassi corretta.
Non sono un genio di bash,ma mi pare che un cat file >/directory  sia adatto 
allo scopo.
-- 
last-kernel-inside

 adatto allo scopo.
Tu verrai impalato all'albero più alto. 

 non riesco a trovare la sintassi corretta.
Se ho capito bene cosa vuoi:
cp vecchaidir/*.pdf nuovadir/
cp -t nuovadir vecchiadir/*.pdf
In questo caso sei scusato perché la pagina del manuale di cp sembra 
scritta coi piedi. Comunque:
info cp
11.1 `cp': Copy files and directories
=====================================
`cp' copies files (or, optionally, directories).  The copy is
completely independent of the original.  You can either copy one file to
another, or copy arbitrarily many files to a destination directory.
Synopses:
     cp [OPTION]... [-T] SOURCE DEST
     cp [OPTION]... SOURCE... DIRECTORY
     cp [OPTION]... -t DIRECTORY SOURCE...
   * If two file names are given, `cp' copies the first file to the
     second.
   * If the `--target-directory' (`-t') option is given, or failing
     that if the last file is a directory and the
     `--no-target-directory' (`-T') option is not given, `cp' copies
     each SOURCE file to the specified directory, using the SOURCEs'
     names.
   Generally, files are written just as they are read.  For exceptions,
see the `--sparse' option below.
...

 non riesco a trovare la sintassi corretta.
xargs -d '\n' cp -t <destdir> < file
-- 
Cio' che si vede, e'.

 cp -t nuovadir vecchiadir/*.pdf
Se invece ho capito male allora:
cpio -p destdir < namelist
info cpio
man cpio


Facebook: Massimo Bacilieri

 Direi che non si usa, che senso ha?! :-O
non che non sia riuscito a far fare allo script quello che mi interessa,
solo volevo capire perché quella forma non va bene.
se con grep posso esaminare l'output di 'cat $1' riga per riga, mi
chiedo perché non posso fare altrettanto con cp, dato che un comando
come 'cp <path/file> è perfettamente lecito.
dipende da come cp elabora i parametri? oppure dal funzionamento delle pipe?
-- 
                     Dona i tuoi cicli di clock alla ricerca!
 
http://boinc.berkeley.edu/
                          --------------------
                      "Questa topica e' utopica."
                      		-- Woody Allen

 scritta coi piedi. Comunque:
Più o meno. Ho provato anche questa sintassi, che sembra pensata apposta
per sostituire "vecchiadir/*.pdf" con un qualche valore restituito da un
altro comando ma non ne ho cavato niente di utile.
-- 
                     Dona i tuoi cicli di clock alla ricerca!
 
http://boinc.berkeley.edu/
                          --------------------
               "Ho fame.  Andiamo a prenderci una birra."

 altro comando ma non ne ho cavato niente di utile.
Prima di tutto mi scuso per aver letto male la domanda. 
``cp -t targetdir files...'' copia molti file in una directory, non fa 
quello che dici tu. Ho già postato la soluzione corretta; quello che 
dici tu si fa con xargs + cp oppure con cpio in modalità pass-through
oppure con un doppio tar oppure con uno script ad hoc.
Propongo altre soluzioni:
tar -c -T filelist -f - | (cd targetdir ; tar -x -f - )
cp -t targetdir $(tr ' ' '\n' < filelist)
***NON PROVATE***
Il problema sta nel fatto che cp è stato progettato per copiare un file
alla volta, poi è stato adattato per copiare molti file in una directory;
altri usi di cp non hanno senso. Qui bisogna ricordare la filosofia 
di UNIX: "Ogni programma fa una sola e la fa bene." 
Ancora cp non legge lo standard input perché non ha senso che lo legga
e non puoi forzare cp a fare ciò.
Se hai ancora problemi con le soluzioni chiedi pure.

 pipe?
No. Dipende dal fatto che cp non legge lo standard input.
Poi non ho capito se cp -t destdir ``$(cat filelist)'' ti funziona o meno.
Ed ancora cosa vuoi dire con : " 'cp <path/file> è perfettamente lecito"? 
cp copia file, non copia directory; ``cp dir1/ dir2/'' genera un messaggio 
di errore la directory dir1 viene ignorata.

 di errore la directory dir1 viene ignorata.
-- 
                     Dona i tuoi cicli di clock alla ricerca!
 
http://boinc.berkeley.edu/
                          --------------------
Un linguaggio che non influenza il tuo modo di pensare circa la programmazione
non vale la pena di essere imparato.

 Cp -t targetdir $(tr ' ' '\n' < filelist)
grazie per i suggerimenti.
-- 
                     Dona i tuoi cicli di clock alla ricerca!
 
http://boinc.berkeley.edu/
                          --------------------
  Prima Legge di Scott:
  	Non importa che cosa vada storto, probabilmente sembrera' a posto.

 che funziona
Un momento. che funzioni, forse, che sia lecito no.
La sintassi di cp è:
cp file1 file2
Oppure
cp file1 [file ... ] directory
Oppure 
cp -t directory file1 [file2 ... ]
cp dà un errore non funziona se metti un solo argomento, dà un errore 
se metti più di una directory, dà un errore se la directory non è l'ultimo 
argomento, dà un errore se metti più di due file senza una directory.
Quindi al massimo potevi scrivere:
cp <path/file> file o directory

 ``cp -t targetdir files...'' copia molti file in una directory, non fa
non mi ritorna la logica di questa opzione,
[michele@arrakis a]$ touch a b c d
[michele@arrakis a]$ cp a b c d
cp: target `d' is not a directory
[michele@arrakis a]$ echo $?
1
[michele@arrakis a]$ mkdir e
[michele@arrakis a]$ cp a b c d e
[michele@arrakis a]$ echo $?
0

 Cp <path/file> file o directory
sì, vabbe', non stiamo a ricamarci più di tanto sulla sintassi di cp. Il
punto era chiarire il suo comportamento se usato con lo stdin. Chiarito
che cp non legge da stdin considero la cosa chiusa qui.
-- 
                     Dona i tuoi cicli di clock alla ricerca!
 
http://boinc.berkeley.edu/
                          --------------------
                - Ieri ho preso un cane per mia moglie.
                - Ah, si'?  E dove fanno questi scambi?
                		-- Da it.hobby.umorismo

 sì, vabbe', non stiamo a ricamarci più di tanto sulla sintassi di cp. 
Sono d'accordo.  Tutto bene

Mario M. Macaluso wrote:

Se specifichi piu' di due argomenti, l'ultimo argomento deve essere una 
directory. Se invece specifichi solo due argomenti, il secondo puo' essere 
una directory oppure no.


 non riesco a trovare la sintassi corretta.
questa non l'ha detta nessuno e a me mi piace
#!/bin/sh
if [ $# -ne 2 ] ; then
    echo "Uso: $0 file_con_nomi directory_di_destinazione"
    exit 1 ; fi
pathnames="$1"
target="$2"
while read pathname ; do cp "$pathname" "$target"; done  < "$pathnames"

 ...
Non mi piace.
Prima di tutto è la soluzione meno efficiente, poi è molto
più complicata di altre soluzioni proposte ed ancora non è 
flessibile. Infine potevi scriverla correttamente
#!/bin/bash
if (( $# < 1 )) ; 
 then
    echo "$0: L'uso è ``directory_destinazione [file_con_nomi ...]''"
    exit 1 
fi
if [[ ! -e "$1" ]]
  then  
   echo "$0: la directory \"$1\" non esiste"
    exit 1 
fi
if [[ ! -d "$1" ]]
then
    echo "$0: Il file \"$1\" non è una directory"
    exit 1 
fi
destinazione="$1"
shift
until [[ -z "$1" ]]
  do
    while IFS= read -r pathname 
      do 
         cp -- "$pathname" "$destinazione"
      done  < "$1"
    shift
  done
if [ ! -t 0 ]
  then 
    while IFS= read -r pathname 
      do 
         cp -- "$pathname" "$destinazione"
      done  < "$1"
    shift
  done
fi  
PS Ancora preferisco `` cpio -p directory_destinazione file_con_nomi''

 ...


    while IFS= read -r "$pathname" 
