Spostamento di una grande quantità di file (~ 100000)


13

Lavoro con cartelle che contengono molti file, come 100000 o addirittura 1 000 000 di file per cartella. Quando provo a spostare il contenuto di una cartella in un'altra, il mio computer si blocca sempre. Anche quando il processo sembra terminato, non riesco a vedere il contenuto di nessuna cartella perché nautilus sembra completamente bloccato e devo forzare il riavvio del computer. Ho notato che ciò accade anche quando provo a spostarmi come 10.000 file.

È un problema del mio computer o è normale quando si lavora con questi numeri?

Qualche modo intelligente di eseguire questo trasferimento di file?


3
Che dire dell'utilizzo del terminale ( cp -R SRC/ DEST/)
UniversallyUniqueID

2
@BharadwajRaju: a seconda dei file cp -a potrebbe essere migliore perché conserva proprietari, timestamp e permessi. Consiglierei anche rsync perché può verificare i trasferimenti e copia solo i file che non esistono già.
Michael,

Aggiornamento: gvfs-copy(dal gvfs-binpacchetto) può essere più veloce di cp.
UniversallyUniqueID

Hai due domande qui invece di una. Si prega di controllare la pagina Come richiedere istruzioni.
Luís de Sousa,

Risposte:


19

Forse potresti utilizzare un metodo a riga di comando puro per trasferire file di grandi quantità, senza dubbio scoprirai che il processo è sostanzialmente più veloce rispetto all'utilizzo di una GUI.

Esistono molti modi diversi per ottenere questo risultato, ma i seguenti hanno funzionato rapidamente, in modo sicuro ed efficiente sul mio sistema:

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Qualche spiegazione per questo comando:

  1. La tua directory di input è "." carattere e per questo comando particolare devi essere in quella directory
  2. La mia directory di output è <destination>nel mio esempio. Ovviamente modificalo in base alle tue esigenze e lascia fuori le parentesi.
  3. Questa sintassi consente nomi di file con spazi come bonus :)

Sono possibili infinite permutazioni ma questo dovrebbe funzionare bene e in modo molto più efficiente della GUI. Una permutazione per esempio: se volessi spostare solo file pdf potresti eseguire:

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

L'uso di xargsapre molte possibilità in particolare con lo spostamento di un numero così elevato di file. Molte, molte possibilità ....

Potenziali problemi:

Ci sono almeno 2 potenziali insidie ​​su cui riflettere, grazie ai commentatori qui sotto per questi pensieri:

  1. La directory di destinazione potrebbe essere corrotta, in una posizione successivamente irraggiungibile, con errori di digitazione ecc. mv, I file verranno spostati lì! Stai attento qui ...
  2. Se l' -topzione ( --target-directory) manca e la cartella di destinazione è in realtà un file, si sposterà un file e il resto non riuscirà. mvha 2 usi: rinomina l' origine nella destinazione o sposta l' origine nella directory . Di nuovo stai attento ...

2
Non lo farebbe solo find . -maxdepth 1 -type f -exec mv -t test {} +?
muru,

@muru: Grazie per questo, ho tagliato un -name...pezzo estraneo ma sono rimasto xargsal suo posto.
andrew.46

2
Non lo so ... Sebbene il comando sia ovviamente corretto così com'è, considererei una mossa completa un po 'troppo soggetta a errori. (E se, ad esempio, dimentichi di includere la -tbandiera? Penso che tutti i file verrebbero "spostati" in un singolo file chiamato test, con conseguente perdita di tutti i tuoi file tranne uno.) Penso che preferirei un rsyncseguito da, se tutto è andato bene, a rm. Tuttavia, posso immaginare scenari in cui tale controllo non può essere automatizzato.
Jos

@Jos: Grazie, ho aggiunto una nota a piè di pagina che descrive questa possibilità. Bello vedere un rsync esempio scritto come una risposta?
andrew.46

Linux supporta elenchi di argomenti estremamente lunghi, quindi probabilmente puoi farlo mv dir1/* dir2e ricorrere solo find -execse c'è un problema o se devi evitare di abbinare le cartelle con il tuo glob. (Sebbene a seconda delle convenzioni di denominazione, spesso *.*corrisponderanno alla maggior parte dei file ma non alla maggior parte delle directory, poiché è comune avere un .extensionfile on e non avere un .nome directory)
Peter Cordes,

4

Ho avuto un'esperienza simile prima, è normale quando si tratta di un gran numero di file. Stavo avendo una grande raccolta di schede tecniche PDF (parti elettroniche).

Gli strumenti della GUI controllano alcuni dettagli del file e metadati (Icona / Miniatura, Dimensione, ...), in questo caso sarà un grosso problema. Anche in Icon View e senza miniature, si bloccheranno poiché la maggior parte di essi non è progettata per casi così estremi. Lo strumento GUI tenta di caricare le icone di presentazione per tutti i file / cartelle nella directory anche se quegli elementi non sono visibili all'utente nella parte corrente dello schermo. Anche l'ordinamento fa parte del problema e non c'è modo di evitarlo.

  • Finisco per dividere i file su cartelle separate in base al marchio / modello meno di 10000 ciascuno. Potrebbe essere possibile utilizzare la data (come la maggior parte delle persone fa con le foto / scansioni) o le prime lettere (come nel repository dei pacchetti Ubuntu )
  • È invece più semplice utilizzare gli strumenti della CLI poiché mostrano solo ciò che è stato richiesto. È possibile utilizzare locateper la ricerca rapida al posto di find.
  • Per l'operazione di spostamento, utilizzare mvnel terminale (gli strumenti della GUI sono lenti perché tentano di aggiornare periodicamente la vista).

    Se si trova nella stessa partizione, il comando modificherà solo i puntatori nell'indice del file system. In caso contrario, sarà una doppia operazione (copia ed elimina). Sarà costoso.

C'è solo un caso che posso aiutare, se stai copiando quei file più volte e non vengono aggiornati. Come ho fatto quando condivido la mia collezione con gli amici, ogni volta che provo a copiarla ci vuole un decennio. (Questo è più utile solo con file di piccole dimensioni)

  • Crea un singolo pacchetto o pochi pacchetti, ad esempio zip con nessuna / bassa compressione. Quando lo copi, sarà più veloce, quindi lascia che DMA faccia il suo lavoro.

3

Se stai cercando una soluzione che ti offra i vantaggi delle operazioni da riga di comando con la sensibilità e la flessibilità della GUI combinate, ti consiglio mc( comandante di mezzanotte ).

mc commander vista a 2 riquadri

È un gestore di file visivi basato su ncurses - hai una vista a due riquadri sui tuoi file e un menu disponibile. L'uso del mouse è possibile, anche su SSH. Puoi sfogliare i tuoi fs, ispezionare i file con il visualizzatore di file, filtrare al volo secondo i criteri e fare eseguire le operazioni di copia o spostamento sulla riga di comando.

È un clone del programma DOS comandante Norton che era popolare a metà degli anni Ottanta. Funziona bene ogni volta che la GUI inizia a diventare inaffidabile per me e ideale per il tuo scopo.


0

Ho riscontrato problemi in qualche modo simili - stavo testando la mia configurazione RAID e quando eseguivo enormi trasferimenti (ad es. Oltre 100.000 file e 1-2 TB di dati in una volta) sembra che i trasferimenti inizino abbastanza velocemente - diciamo ~ 200 MB / sec, quindi rallenta rapidamente fino a un plateau ragionevole ~ 90-120 MB / sec (possibilmente dopo aver consumato un po 'di memoria cache flash sulle unità). Quindi, dopo 20-30 minuti, l'operazione inizia gradualmente a scendere su un altopiano molto più basso ~ 30-40 MB / sec, peggio ancora quando si tratta di file di piccole dimensioni, portando un'operazione di 4-5 ore più vicino a 15 ore.

Ho trascorso un po 'di tempo a cercare di diagnosticare, ad esempio possibili guasti dell'unità. Nonostante abbia provato diversi strumenti: riga di comando, nautilus, non sono riuscito a mantenere un throughput decente per operazioni di copia molto grandi.

Quello che ha funzionato meglio per me è stato usare il comandante di mezzanotte e ogni volta che la copia si rallentava, mettevo in pausa l'operazione fino a quando la luce del disco rigido si spegneva dopo che tutte le operazioni in sospeso si spegnevano - di solito un minuto circa - quindi riattiva nuovamente MC e tornerebbe a un ritmo decente per altri 20-30 minuti. Piuttosto fastidioso però.

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.