9

Я искал в сети ответ Linux на что-то вроде Teracopy (Windows)... но не смог найти ничего подходящего.

Самые близкие вещи, которые я получил:

Может кто-нибудь порекомендовать мне простой инструмент для копирования файлов, который может ставить в очередь файлы для копирования / перемещения / удаления? Желательно, если я могу перетащить из Наутилуса.

Если что-то подобное не существует, может кто-нибудь сказать, пожалуйста, почему? ... я единственный человек, которому нужно что-то подобное?

7 ответов7

3

Я просто написал этот простой скрипт, который я назвал «cpw», чтобы решить эту проблему.

Вы используете его так же, как если бы вы использовали cp ... единственное отличие состоит в том, что он создает массив всех процессов cpw, которые уже запущены при его запуске, и ожидает их завершения, прежде чем передать команды в cp. Таким образом, он ведет себя как самоорганизующаяся очередь.

Вы можете продолжать добавлять фоновые задания cpw, но они не будут наступать друг на друга. Они будут выполнять по одному за раз.

Я уверен, что другие могут предложить улучшения.

#!/bin/bash

cpwpids=(`ps -ef | grep $USER | grep 'cpw' | grep -v grep | grep -v $$ | awk '{ print $2 }'`) #build an array of all cpw procs for this user that aren't this one.

cpwcnt=${#cpwpids[@]} # number of elemenets in the above array
cnt=$cpwcnt # counter to be decremented each pass
while [ $cnt -gt 0 ]
do
    cnt=$cpwcnt
    for i in "${cpwpids[@]}" # check if each pid has died yet
    do
        ps --pid $i >/dev/null
        if [ $? -gt 0 ]
        then
            let "cnt -= 1"
        fi
    done
    sleep 2
done
cp -v "$@" >> /tmp/cpw.log #log

Пример использования:

$ cpw -R /src/tree /dest/tree &
1

Поскольку у сценария Джоша Аренберга могут быть проблемы с блокировкой (которые я до сих пор не испытывал, но и не исследовал), я написал кое-что самостоятельно. У него не должно быть проблем с блокировкой. Это также работает для любой команды оболочки, а не только для cp.

Contents of ~/bin/q

#!/bin/bash

#this waits for any PIDs to finish
anywait(){

    for pid in "$@"; do
        while kill -0 "$pid" 2&>1 >/dev/null; do
            sleep 0.5
        done
    done
}


PIDFILE=~/.q.pid

#open PIDFILE and aquire lock
exec 9>>$PIDFILE
flock -w2 9 || { echo "ERROR: flock() failed." >&2; exit 1; }

#read previous instances PID from PIDFILE and write own PID to PIDFILE
OLDPID=$(<$PIDFILE)
echo $$>$PIDFILE

#release lock
flock -u 9

#wait for OLDPID
anywait $OLDPID

#do stuff
"$@"


#afterwards: cleanup (if pidfile still contains own PID, truncate it)
flock -w2 9 || { echo "ERROR: flock() failed." >&2; exit 1; }
if [ $(<$PIDFILE) == $$ ]; then
truncate -s0 $PIDFILE
fi
flock -u 9

Он создает цепочку процессов, каждый из которых ожидает предыдущего. Если во время ожидания происходит сбой процесса в середине цепочки (маловероятно, но не невозможно), цепочка разрывается, и обе части работают параллельно. То же самое происходит, если один из процессов убит.

Использование как это:

q $COMMAND $ARGS

или даже

q $COMMAND $ARGS; $ANOTHER_COMMAND $MORE_ARGS

Проверьте, например, набрав

q sleep 10 &
q echo blubb &

и обнаружив, что через 10 секунд распечатывается жир.

1

Ultracopier это тот, который вы хотите, с плагином Nemo или плагином Nautilus.

1

По моему опыту, одновременное выполнение нескольких копий в Linux не снижает общую пропускную способность. Мое измерение пропускной способности основано на аргументе rsync -P. Мой конкретный случай - это одновременное копирование нескольких папок, заполненных большими файлами, с жесткого диска USB одновременно.

Так что если вы не копируете много вещей одновременно, у вас все будет хорошо.

0

Я нашел этот проект Unix Batch System под названием Task Spooler, который позволяет вам ставить задачи в очередь.

Или вы можете сделать sudo apt-get install task-spooler

После установки вы можете просто поставить ts (или tsp для систем Ubuntu/Debian) перед любой обычной командой оболочки, чтобы поставить ее в очередь.

На этой странице есть много примеров ее использования: https://www.ostechnix.com/add-linux-commands-queue-execute-one-one/ или вы смотрите видео здесь: https://www.youtube.com/ смотреть?v = wv8D8wT20ZY

Я проверил это, и он, кажется, работает как и ожидалось для всех моих команд cp .

0

Я не знаю ничего подобного для Linux (хотя нельзя сказать, что где-то такого нет). Программное обеспечение Linux обычно пишется пользователями Linux. Опытные пользователи Linux могут не подумать о создании подобного инструмента, потому что, если они заметят какое-либо замедление копирования во время сеанса с графическим интерфейсом, они, скорее всего, переключатся на терминал и копируют с помощью командной строки.

Вот несколько основных утилит для копирования из командной строки, которые очень быстры и не должны влиять на вашу рабочую среду:

  • cp ("cp foo /path /to /bar" копирует foo в bar)
  • mv ("mv foo /path /to /bar" переместит (переименует) foo в bar)
  • tar ("tar cf - foo | (cd /path /to /archive /; tar xf -)" будет рекурсивно копировать каталог)
  • rsync ("rsync -r foo /path /to /archive /" рекурсивно скопирует каталог)
0

Создайте список файлов и используйте SCP для выполнения копирования. Хорошая вещь в Linux - вы можете добавить в свой текстовый файл, используя echo.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .