Существует ли способ скопировать файлы с папки к папке b, но иметь паузу процесса в течение секунды между каждым файлом? Я хочу скопировать много файлов к папке часов, но я знаю на основе опыта, что, если я копирую всех их сразу (или через терминальное CP или через GUI) это заставит мой rtorrent отказать... Если бы я мог бы скопировать файлы со вторым интервалом между ними, которые дали бы rtorrent время для обработки вещей. Если бы я мог бы сделать это от одной команды, которая сохранила бы меня от выполнения его один за другим вручную.
Среди многих опций, включая циклы, которые используют 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
parallel
Вот a 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' "{}" \;