sposta file per elenco in file (con spazi bianchi iniziali)


12

Ho un file che contiene nomi di file. Per esempio:

/tmp/list.txt (è con gli spazi all'inizio di ogni riga):

  /tmp/file.log
  /app/nir/home.txt
  /etc/config.cust

Voglio, utilizzando la linea uno, per spostare tutti i file elencati in /tmp/list.txta/app/dest

Quindi dovrebbe essere qualcosa del genere:

cat /tmp/list.txt | xargs mv /app/dest/

Risposte:


21

Manca solo l' -topzione per mv(supponendo GNU mv):

cat /tmp/list.txt | xargs mv -t /app/dest/

o più breve (ispirato alla risposta di X Tian):

xargs mv -t /app/dest/ < /tmp/list.txt

gli spazi iniziali (e possibili finali) vengono rimossi. Gli spazi all'interno dei nomi dei file porteranno a problemi.

Se hai spazi, tabulazioni o virgolette o barre rovesciate nei nomi dei file, supponendo che GNU xargspuoi usare:

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/

Grazie per la risposta . con questo posso fare un elenco di molti file con [!] nel loro nome e spostarmi in un'altra cartella, con il seguente: ls | grep -e ". [!]]" | tee 001.txt; sed 's / ^ * //' <001.txt | xargs -d '\ n' mv -t / destinypath /
inukaze

6

Supponendo che i nomi dei tuoi file siano relativamente sani (nessuna nuova riga o caratteri strani):

while read file; do mv "$file" /app/dest/; done < list.txt 

Per gestire nomi di file strani (si interrompe se il nome di un file ha una nuova riga):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 

Ciao terdon, come spostare le cartelle in una nuova directory in base alla loro corrispondenza nel file CSV? Potresti aiutarmi per favore con questo [ unix.stackexchange.com/questions/433068/… Grazie !!
user3351523

@ user3351523 la tua domanda è stata chiusa. Chiedere aiuto a persone a caso non lo cambierà. Invece, modifica la domanda e spiega come le soluzioni nel duplicato non ti hanno aiutato. Se qualcosa "non ha funzionato", spiega come ha fallito. Le soluzioni dovrebbero funzionare per te, quindi devi spiegare cosa succede quando le provi.
terdon

L'ho fatto. puoi dare un'occhiata.
user3351523

@ user3351523 non hai spiegato perché le soluzioni del dupe non funzionano per te. E non hai spiegato come le risposte che hai ottenuto falliscano. Potresti aver solo bisogno di usare, cp -Hrma non so se OSX lo cpsupporti.
terdon

3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done

1

Xargs puri che leggono direttamente dal file

xargs -l -i < flist  mv -v {} /app/dst

modifica 1 - dopo il commento di @Anthon di seguito,

xargs -I{} < flist  mv -v {} /app/dst

1
-iè deprecato e sostituisce -Io intendo -l/ --max-lines=1. E causa mvl'esecuzione per ogni file separatamente.
Anthon,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.