2017-01-20 9 views
0

У меня есть текстовый файл с большим количеством путей к файлу. Мне нужно скопировать все эти файлы из исходного каталога (указанного в пути в файле по каждой строке) в целевой каталог.Каков самый быстрый способ скопировать большое количество путей к файлам, упомянутых в текстовом файле, из одной директории в другую

В настоящее время, в командной строке я попытался это

while read line; do cp $ line dest_dir; done < my_file.txt 

Это, кажется, немного медленно. Есть ли способ распараллеливать все это или ускорять его?

+0

* Есть ли способ parallelise всю эту вещь * Есть ли у вас есть дисковая система может одновременно считывает и записывает и из нескольких мест? –

+0

@HighPerformanceMark Я на сервере unix и подключен к внешнему SSD-диску. –

+0

@HighPerformanceMark, поэтому у меня есть файл, содержащий большой набор путей к файлам, которые находятся на SSD. Мне нужно скопировать их в каталог на сервере. Несмотря на то, что SSD установлен на машине, цель состоит в том, чтобы скопировать его на сервер, а затем выполнить команду scp, чтобы скопировать весь каталог на мой ноутбук. –

ответ

2

Вы можете попробовать GNU Parallel следующим образом:

parallel --dry-run -a fileList.txt cp {} destinationDirectory 

Если вам нравится то, что он говорит, удалить --dry-run.

+0

Параллелизация дискового ввода-вывода может быть или не быть быстрее: https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/ –

+0

@OleTange Да, спасибо. Я знал об этом, и я пытался предположить, что это просто предложение попробовать - как вы говорите в своей статье. Ссылка на вашу статью очень уместна - спасибо. –

0

Вы могли бы сделать что-то как следующее (в выбранной оболочки)

 

    #!/bin/bash 

    BATCHSIZE=2 

    # **NOTE**: check exists with -f and points at the right place. you might not need this. depends on your own taste for risk. 
    ln -s `which cp` /tmp/myuniquecpname 

    # **NOTE**: this sort of thing can have limits in some shells 
    for i in `cat test.txt` 
    do 

    BASENAME="`basename $i`" 

    echo doing /tmp/myuniquecpname $i test2/$BASENAME & 

    /tmp/myuniquecpname $i test2/$BASENAME & 

    COUNT=`ps -ef | grep /tmp/myuniquecpname | grep -v grep | wc -l` 

    # **NOTE**: maybe need to put a timeout on this loop 
    until [ $COUNT -lt $BATCHSIZE ]; do 

    COUNT=`ps -ef | grep /tmp/myuniquecpname | grep -v grep | wc -l` 
    echo waiting... 
    sleep 1 

    done 

    done