Qual è il modo più efficiente per spostare un gran numero di file che risiedono in una singola directory?


11

CentOS 5.x

Mi scuso se questa è una domanda ripetuta. Ho visto molte domande simili (riguardanti l'eliminazione dei file) ma non esattamente lo stesso scenario.

Ho una directory contenente centinaia di migliaia di file (forse oltre un milione) e come soluzione a breve termine per un problema diverso, ho bisogno di spostare questi file in un'altra posizione.

Ai fini della discussione, supponiamo che questi file risiedano originariamente in /home/foo/bulk/e voglio spostarli in/home/foo2/bulk2/

Se provo mv /home/foo/bulk/* /home/foo2/bulk2/ ottengo un errore "troppi argomenti".

Google mi ha detto che un'alternativa per eliminare i file in blocco sarebbe quella di eseguire find. Qualcosa di simile a: find . -name "*.pdf" -maxdepth 1 -print0 | xargs -0 rm

Andrebbe bene se stavo cancellando qualcosa ma in questo caso voglio spostare i file ... Se scrivo qualcosa come find . -name "*" -maxdepth 1 -print0 | xargs -0 mv /home/foo2/bulk2/bash si lamenta che il file non è una directory.

Qual è il comando migliore da usare qui per spostare i file alla rinfusa da una directory all'altra?

Risposte:


16

Approfittando GNU di mv's -topzione per specificare la directory di destinazione, invece di basarsi su l'ultimo argomento:

find . -name "*" -maxdepth 1 -exec mv -t /home/foo2/bulk2 {} +

Se fossi su un sistema senza l'opzione, potresti usare una shell intermedia per ottenere gli argomenti nel giusto ordine ( find … -exec … +non supporta l'inserimento di argomenti extra dopo l'elenco dei file).

find . -name "*" -maxdepth 1 -exec sh -c 'mv "$@" "$0"' /home/foo2/bulk2 {} +

Puoi usare find ... -exec sh -c 'blah "$ @" blah' sh {} + "(il" trucco della shell ") per affrontare i problemi relativi all'ordinamento degli argomenti. Ci sono molti esempi di ciò nei findutils ( info) documentazione; cerca "sh -c".
James Youngman,

5

Prendi in mvconsiderazione la directory principale anziché i file:

mv /home/foo/bulk /home/foo2/bulk2 && mkdir /home/foo/bulk

(Ma potrebbe causare problemi se /home/foo/bulkdeve esistere in ogni momento.)


1
Vorrei aggiungere a ciò, nel caso in cui la directory di destinazione esista, spostare i file nella directory di destinazione nella directory di origine (quella più grande) e rinominare la directory.
sbenitezb,

Grazie - ottimo suggerimento. In questo caso, la directory deve esistere in ogni momento. Ottima idea però.
Mike B,

Devo ammettere che non capisco cosa fa questa risposta. Perché mkdir? E che dire di quella dir "esistente in ogni momento" o no? Perché questo dovrebbe accelerare le cose?
Monica Heddneck,

So che questo commento ha un anno, ma l'ultimo aveva cinque anni, quindi ho pensato che potrei anche rispondere ... Le tue prime due domande sono correlate. Il mkdirmotivo è che l'intera cartella e tutto ciò che al suo interno verrebbero spostati nell'altra directory e non esisterebbero più nella vecchia directory. Assicura che la vecchia directory esista ancora. Tuttavia, ciò non sarebbe sufficiente se esistesse un servizio costantemente in esecuzione che dipendeva dalla prima directory sempre esistente, poiché veniva spostata e ricreata. Non rende nulla più veloce, solo più semplice fornendo meno argomenti.
Lucas Leblanc,

0

Solo per varietà, mi piace usare cpio per alcuni casi come questo.

find tmp |cpio -v  -p --make-directories --sparse tmp2

1
Se l'origine e la destinazione si trovano sullo stesso file system, questo approccio potrebbe essere molto inefficiente (copia non necessaria). Inoltre è sempre meglio usare -print0e le -0opzioni.
pabouk,

0

Con GNU mv:

find . -mindepth 1 -exec mv -t /tmp {} +

Su sistemi come OS X che non hanno mv -tma hanno -print0e xargs -0:

find . -mindepth 1 -print0|xargs -0 -I, mv , /tmp

O se i nomi dei file non contengono spazi, virgolette, barre rovesciate o newline (con OS X xargs) o virgolette, barre rovesciate o newline (con GNU xargs):

ls|xargs -I, mv , /tmp

-3

Per un periodo di tempo specificato, provare quanto segue:

find . -name "*" -type f -mtime +7 -exec mv -t /folder/to/transfer/files {} +
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.