Ho avuto una risposta imbarazzante intorno qui prima, ma la risposta di Denis mi ha ricordato che mi mancava la cosa più elementare. Quindi, ho eliminato la mia risposta originale. Ma dal momento che nessuno ha detto questa cosa molto semplice, penso che valga la pena metterlo qui.
La domanda originale è "Ho un file di testo con un elenco di nomi di file separati da spazi. Come posso copiarli in una directory di destinazione." All'inizio questo può sembrare complicato o complicato, perché pensi di dover in qualche modo estrarre gli elementi dal file in un modo specifico. Tuttavia, quando la shell elabora una riga di comando, la prima cosa che fa è separare l'elenco degli argomenti in token e (ecco il bit che nessuno ha mai detto apertamente) spazi token separati . (Newline inoltre separano i token, motivo per cui il test di Doug Harris con un elenco separato da una nuova riga ha avuto lo stesso risultato.) Cioè, la shell si aspetta e può già gestire un elenco separato da spazi.
Quindi tutto ciò che devi fare qui è mettere l'elenco separato da spazi (che hai già) nel posto giusto nel tuo comando. Il tuo comando è una variazione su questo:
cp file1 file2 file3...file# target
L'unica ruga è che vuoi ottenere l'elenco dei file da 1 a # dal tuo file di testo.
Come sottolinea Dennis nel suo commento, il tuo tentativo originale ( cp
cat list.txt new_folder
) avrebbe dovuto funzionare già. Perché? Perché il comando interno cat list.txt
viene elaborato per primo dalla shell e si espande file1 file2 file3...file#
, che è esattamente ciò che la shell si aspetta e vuole da quella parte del comando. Se non ha funzionato, allora (1) hai avuto un refuso o (2) i tuoi nomi di file erano in qualche modo strani (avevano spazi o altri caratteri insoliti).
Il motivo per cui tutte le risposte di Dennis funzionano è semplicemente che forniscono l'elenco necessario di file su cui cp
lavorare, posizionando tale elenco nel punto in cui appartiene all'intero comando. Ancora una volta, il comando stesso è questo nella struttura:
cp list-of-files target_directory
È facile vedere come tutto si combina in questa versione:
cp $(<list.txt) new_folder
$()
fa sì che la shell esegua il comando tra parentesi e quindi sostituisca il suo output in quel punto nella linea più grande. Quindi la shell esegue la linea nel suo insieme. A proposito, $()
è una versione più moderna di quello che stavi già facendo con i backtick (`). Next: <
è un operatore di reindirizzamento dei file. Indica alla shell di scaricare il contenuto list.txt
dell'input standard. Poiché il $()
bit viene elaborato per primo, ecco cosa succede nelle fasi:
cp $(<list.txt) new_folder
# split line into three tokens: cp, $(<list.txt), new_folder
cp file1 file2 file3...file# new_folder
# substitute result of $(<list.txt) into the larger command
Ovviamente il passaggio 2 è semplicemente il normale cp
comando desiderato.
Mi rendo conto che sto battendo molto questo cavallo (forse molto morto), ma penso che valga la pena farlo. Comprendere esattamente come la shell elabora un comando può aiutarti a scriverlo meglio e semplificare molto. Ti mostrerà anche dove è probabile che i problemi si nascondano. In questo caso, ad esempio, la mia prima domanda per te avrebbe dovuto riguardare nomi di file divertenti o un possibile errore di battitura. Non erano necessarie acrobazie.