Програма для файлів черги для копіювання / переміщення / видалення в Linux?


10

Я шукав у мережі відповідь Linux на щось на кшталт Teracopy (Windows) ... але не знайшов нічого підходящого.

Найближчі мені речі:

Чи може хтось порекомендувати мені простий інструмент копіювання файлів, який може чекати файли для копіювання / переміщення / видалення? Переважно, якщо я можу перетягнути з Nautilus.

Якщо чогось подібного не існує, може хтось, будь ласка, сказати мені чому? ... я єдина людина, якій потрібно щось подібне?


2
Якщо ви могли б пояснити, що саме ви хочете, було б корисно. Напевно, більшість користувачів Linux не знайомі з "Теракопією".
Пельтьє

1
Це тому, що великі копії та видалення потребують часу, а інтерфейс GUI недоступний / менш корисний під час їх роботи?
dmckee --- кошеня колишнього модератора

Часткове пояснення цього запиту можна знайти тут: superuser.com/questions/9284/…
dmckee --- кошеня колишнього модератора

Зачекайте хвилину, чи MiniCopier не доступний для Linux? Це додаток Java.
Райан К. Томпсон,

1
@Tobu Terracopy може чергати і призупиняти роботу з кількома копіями
Kokizzu

Відповіді:


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 &

Просто попередження, я спробував цей сценарій, і тому я не досліджував далі, він може нескінченно висіти, чекаючи, коли інші сценарії завершаться. Більш надійний спосіб досягти ексклюзивності в bash - це використовувати flock -e. Дивись, наприклад , тут: stackoverflow.com/questions/17996577 / ...
px1mp

1

На мій досвід, робити кілька копій одночасно в Linux насправді не знижує загальну пропускну здатність. Моє вимірювання пропускної здатності базується на аргументі rsync -P. Мій конкретний випадок - окремо копіюючи одночасно декілька папок з великими файлами з жорсткого диска USB.

Тож якщо ви не копіюєте багато речей одночасно, вам слід добре.


Вибачте, але це більше нагадує коментар. Дуже багато думок, насправді не відповідь.
Mrchief

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 секунд друкується пляма.


Іноді я отримую відмову в дозволі на помилку для while kill -0 "$pid" 2&>1 >/dev/null; doрядка Будь-які ідеї?
Mrchief

Гаразд, після довгого використання цього моменту я можу сказати, що він не працює. Можливо, помилка доступу є причиною цього, але я бачу кілька cpкроків один на одного.
Mrchief


0

Я не знаю нічого подібного для Linux (хоча це не означає, що його десь немає). Програмне забезпечення Linux, як правило, пишеться користувачами Linux. Досвідчені користувачі Linux можуть не подумати створити подібний інструмент, тому що якщо вони помітять уповільнення копій під час сеансу GUI, вони, ймовірно, перейдуть на термінал і скопіюють за допомогою командної лінії.

Ось основні утиліти для копіювання командного рядка, які дуже швидко не повинні впливати на середовище робочого столу:

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

0

Створіть список файлів і використовуйте SCP для виконання копії. Приємна річ у Linux - це те, що ви можете додати до свого текстового файлу за допомогою echo.


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команд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.