Файлы копии от одной папки до другого, но имеют интервал между каждым файлом

Существует ли способ скопировать файлы с папки к папке b, но иметь паузу процесса в течение секунды между каждым файлом? Я хочу скопировать много файлов к папке часов, но я знаю на основе опыта, что, если я копирую всех их сразу (или через терминальное CP или через GUI) это заставит мой rtorrent отказать... Если бы я мог бы скопировать файлы со вторым интервалом между ними, которые дали бы rtorrent время для обработки вещей. Если бы я мог бы сделать это от одной команды, которая сохранила бы меня от выполнения его один за другим вручную.

7
задан 25 May 2018 в 12:27

2 ответа

Единственные решения для команды

Среди многих опций, включая циклы, которые используют cp и sleep, мы могли выбрать find с два -exec флаги для выполнения тех точных команд.

find ~/dir_1/ -type f -maxdepth 1  -exec cp {} ~/dir_2 \;  -exec sleep 1   \;

Здесь опции:

  • ~/dir_1 , каталог источника, через который find работы.
  • -type f получите только файлы
  • -maxdepth 1 убывайте вниз 1 максимум уровня в дереве каталогов; предотвращает убывание в подкаталоги
  • -exec cp {} ~/dir_2 \; скопируйте в настоящее время обрабатываемый файл, определяемый {} параметр к ~/dir_2. \; определяет для cp обработать единственный файл за один раз вместо того, чтобы прикрепить как можно больше файлов в {}. Обратная косая черта в \; необходимо, чтобы препятствовать тому, чтобы оболочка неправильно истолковала это как разделитель команды.
  • exec sleep 1 \; выполняется sleep 1 на каждый текущий файл.

Если у Вас есть список файлов в файле, можно сделать:

xargs -I % --arg-file=input.txt sh -c 'cp % ~/dir_2/ ;sleep 1'

Опции здесь:

  • -I % определяет символ, который относится к файлу в рамках команды
  • --arg-file=input.txt считайте аргументы для управления из определенного файла
  • sh -c 'cp % ~/dir_2/ ;sleep 1' выполниться /bin/sh с обеспеченными командами -c '...' флаг; % будет заменен с именем файла.

Решения для цикла

Вы могли использовать для цикла, например,

for f in "/path/to/folder_1"/*; do
    cp "$f"  "/path/to/folder_2/"
    sleep 1
done

Для ясности это отформатировано на нескольких строках, но это работает одной строкой точно также. Вы могли также превратить это в функцию:

delaycp(){
    for f in "$1"/*; do
        cp "$f"  "$2"/
        sleep 1
    done
}

И используйте его как

delaycp "/path/to/folder1" "/path/to/folder2"

С другой стороны, если Вы хотите скопировать только определенные файлы, не все это * шарик получает в каталоге, Вы могли всегда использовать расширение пути, что-то как file{1..25}, или имейте входной текстовый файл, что-то вроде этого input.txt:

/path/to/folder_1/file1
/path/to/folder_1/file2
/path/to/folder_1/file3

И оттуда используйте while IFS= read -r line структура для чтения файла:

while IFS= read -r line || [ -n "$line" ]; do
    cp "$line" "/path/to/folder_2/${line##*/}"
    sleep 1
done < input.txt
10
ответ дан 23 November 2019 в 06:20

С parallel

Вот a parallel Install parallel решение, дайте аргументы parallel с ::: точно как с cp или использование список файлов:

parallel -j1 'cp {} /path/to/dir2/;sleep 1' ::: /path/to/dir1/* # or
parallel -j1 'cp {} /path/to/dir2/;sleep 1' :::: /path/to/file_list.txt

-j опция говорит parallel работать только 1 задание сразу вместо рабочих заданий параллельно, одинарные кавычки просто содержат сценарий где {} заменяется в настоящее время обрабатываемым файлом и ::: или :::: представьте список аргументов или файл (файлы) соответственно. Посмотрите man parallel для намного больше.

С find -exec

find обеспечивает удобный способ выполнить команды на результатах, например, скопировать каждый .log файл в и под текущим каталогом делает:

find -name "*.log" -exec sh -c 'cp "$0" /path/to/dir2/;sleep 1' "{}" \;
2
ответ дан 23 November 2019 в 06:20

Другие вопросы по тегам:

Похожие вопросы: