При копировании файлов с использованием cp
можно ли отобразить ход и скорость передачи? В противном случае, есть ли альтернативная утилита командной строки, которая может это сделать? Р>
При копировании файлов с использованием cp
можно ли отобразить ход и скорость передачи? В противном случае, есть ли альтернативная утилита командной строки, которая может это сделать? Р>
Пока cp
не имеет этой функции, вы можете использовать pv
для этого:
pv my_big_file > backup/my_big_file
Примечание. Этот метод потеряет права доступа и права на файл. Файлы, скопированные таким образом, будут иметь одинаковые разрешения, как если бы вы создали их сами и будете принадлежать вам. Р>
В этом примере pv
в основном просто выводит файл в stdout *, который вы перенаправляете в файл с помощью оператора >
. Одновременно он печатает информацию о прогрессе на терминале, когда вы это делаете.
Это выглядит так:
[email protected]:~/Data$ pv my_big_file > backup/my_big_file
138MB 0:00:01 [73.3MB/s] [=================================>] 100%
Возможно, вам понадобится Установить pv (альтернативно, введите
sudo apt-get install pv
) в вашей системе.
*: Технический бит
В unix-подобной системе есть три важных потока данных: stdout (стандартный вывод), stderr (стандартная ошибка) и stdin (стандартный ввод). В каждой программе есть все три, так сказать. Оператор-труба перенаправляет вывод программ на другой ввод программ. Оператор >
перенаправляет стандартный вывод программ в файл. cp
в основном ничего не делает больше, чем
cat source > destination
(где cat
просто читает файл и печатает его на stdout). pv
- это как кошка, но если вы перенаправите его выходной поток где-то в другом месте, он будет выводить информацию о ходе на stdout вместо.
Взгляните на man pv
, чтобы узнать больше об этом.
Другой вариант: DoR предлагает этот ответ , заключается в использовании rsync:
rsync -ah --progress source-file destination
р>
![]()
Это сохранит права доступа / права на файлы при показе прогресса.
Нет. См. здесь о том, почему. Хотя он делает больше, чем вам нужно, rsync имеет один параметр --progress
. -a будет сохранять разрешения и т. Д., И -h будет доступен для чтения человеком.
rsync -ah --progress source destination
Результат будет выглядеть примерно так:
Pictures/1.jpg
2.13M 100% 2.28MB/s 0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
1.68M 100% 1.76MB/s 0:00:00 (xfr#5899, to-chk=0/5905)
Если вы хотите, чтобы ваши файлы были правильно переданы, вы можете использовать gcp
, а gcp
- как cp, но по умолчанию дает вам индикатор выполнения, чтобы вы могли видеть, что копируется. В качестве вики-файлов программы gcp
имеет несколько полезных функций, таких как
- индикация перехода к передаче
- непрерывное копирование при ошибке (переход к следующему файлу)
- ведение журнала копирования: gcp регистрирует все свои действия, чтобы можно было узнать, какие файлы были успешно скопированы.
- name mangling для обработки ограничений целевой файловой системы (например, удаление несовместимых символов «*» или «?» на FAT)
Однако даже когда индикатор выполнения достиг 100% при использовании инструмента, вы должны дождаться появления подсказки терминала перед безопасным удалением носителя, чтобы вы могли убедиться, что процесс передачи успешно завершен.
gcp
используется для копирования файлов и имеет такие параметры, как --preserve
, чтобы можно было сохранить различные атрибуты и разрешения и --recursive
, чтобы можно было скопировать целые каталоги. Более подробную информацию о его вариантах можно найти, введя man gcp
или перейдя в страницы Ubuntu онлайн . Учебник также доступен на этом сайте . р>
Установите gcp
из репозиториев с помощью
sudo apt-get install gcp
( Примечание : в Ubuntu 12.10 новая точка автомата - это, например, /media/user/usbdisk
)
Вы можете скопировать файл на свой носитель, введя
gcp /home/mike/file.mp4 /media/usb
и скопируйте папку на свой носитель с помощью
gcp -rv ~/Podcasts /media/Mik2
Пример вывода из gcp
с индикатором выполнения:
gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################| 7.98 M/s Time: 00:00:22
Вы можете, конечно, указать несколько файлов или папок для копирования на свой диск, а также есть много других опций, включенных в man gcp
.
Я получаю удовольствие от использования cURL для этой конкретной цели. Страница руководства перечисляет протокол «ФАЙЛ» как поддерживаемый, поэтому просто используйте его, как и любой другой протокол в URL-адресе:
curl -o destination FILE://source
Скорость, прогресс, время и т. д. - все в знакомом формате.
Пока он не отображает скорость, при копировании нескольких файлов параметр -v
команды cp
предоставит вам информацию о ходе. например.
cp -rv old-directory new-directory
Ядро знает большинство данных, таких как скорость, а часто и процент. Современные ядра выставляют это через свою файловую систему / proc.
showpeed из Ссылка использует эту информацию. Он может подключаться к уже запущенным программам и периодически предоставлять такие обновления:
$ dd if=bigfile of=/tmp/otherbigfile &
$ showspeed dd
dd looks like a process name. pid=4417 matches av0=dd.
p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB) 9m:35
p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB)
p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB) 8m:08
p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB) 8m:01
p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB) 7m:39
p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB)
p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB) 7m:37
p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB) 7m:18
p/4417/fd/1w /tmp/otherbigfile 67MB/s (4.0GB)
p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB)
...
В то время как pv
может обрабатывать локальные задачи cp
, использование dd
с pv
может обрабатывать как локальные ( cp
), так и удаленные ( scp
) задачи.
dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv
Пожалуйста, убедитесь, что path/to/dest.mkv
выходит из touch path/to/dest.mkv
Это может показать прогресс, но если вы хотите получить процентную информацию,
dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
Замените 100M
выше с реальным размером исходного файла.
В то время как scp
вряд ли может показать текущий прогресс, использование dd
с pv
является куском торта.
ssh [email protected] dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
Появится новый инструмент cv, который может найти любой дескриптор, связанный с текущей командой, и показать прогресс и скорость: Ссылка
cv -w
выводит статистику для всех выполняемых операций cp, mv и т. д.
В репозиториях есть инструмент, называемый progress
, который может проверять различные команды и отображать информацию о ходе выполнения для них.
Установите его с помощью команды
sudo apt-get install progress
Этот инструмент можно использовать следующим образом:
cp bigfile newfile & progress -mp $!
Вывод:
[11471] cp /media/Backup/Downloads/FILENAME.file
29.9% (24.2 MiB / 16 MiB)
Как многие говорили, cp не включает эту функциональность.
Просто чтобы бросить мои 0,02 доллара, что я обычно делаю с тривиальными ситуациями копирования (т. е. нет -R
):
Посмотрите, насколько велик файл и помните
Начать копирование
Открыть другой терминал
Запустите watch ls -lh DIR
в каталоге, где цель
Это поможет мне обновить размер целевого файла с минимальными трудностями.
В качестве альтернативы для менее тривиальных ситуаций, например. рекурсивно копируя каталоги, вы можете использовать watch du -hs DIR
, чтобы просмотреть сводку размера DIR. Однако du может занять много времени и может даже замедлить копирование, поэтому вы можете использовать аргумент -n INTERVAL
для просмотра, чтобы компромисс был приемлемым.
Обновление: . Если вы используете wild-cards с командой, используемой с watch du, например. watch du -hs backup/*
, не забудьте указать:
watch "du -hs backup/*"
иначе wild-cards будут расширены только один раз , когда часы запущены , поэтому du не будет смотреть на новые файлы / подкаталоги.
dd status=progress
р>
Добавлена опция в GNU Coreutils 8.24+ (Ubuntu 16.04):
dd if=src of=dst status=progress
Stdout - это периодически обновляемая строка, например:
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
См. также: Как вы отслеживаете прогресс dd? р>
Используйте сценарий оболочки:
#!/bin/sh
cp_p()
{
strace -q -ewrite cp -- "" "" 2>&1 \
| awk '{
count += $NF
if (count % 10 == 0) {
percent = count / total_size * 100
printf "%3d%% [", percent
for (i=0;i<=percent;i++)
printf "="
printf ">"
for (i=percent;i<100;i++)
printf " "
printf "]\r"
}
}
END { print "" }' total_size=$(stat -c '%s' "") count=0
}
Это будет выглядеть так:
% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================> ]
В зависимости от того, что вы хотите сделать, Midnight Commander ( mc
) может быть ответом. Я удивлен, что он еще не упоминался.
Инструменты, такие как pv
или rsync
, хороши для отображения прогресса передачи одного огромного файла, но когда дело доходит до копирования целых каталогов / деревьев, mc
вычисляет размер, а затем отображает прогресс очень красиво. Кроме того, он доступен из коробки в большинстве систем.
Если у вас есть rsync 3.1 или выше ( rsync --version
), вы можете копировать (cp -Rpn), сохраняя разрешения и права собственности, каталоги recurse, «no clobber» и отображая общий прогресс (а не просто прогресс по файлу) , скорость копирования и (очень грубое) расчетное время, оставшееся с помощью:
sudo rsync -a --info=progress2 --no-i-r /source /destination
Обратите внимание, что sudo требуется только при работе с каталогами / файлами, которые у вас нет. Кроме того, без --no-i-r
процент может сбрасываться на меньшее число в какой-то момент во время копирования. Возможно, более поздние версии rsync будут по умолчанию для no-i-r с информацией = progress2, но это не в текущей версии 3.1.2. Р>
Я обнаружил, что процент и оставшееся время сильно завышены при копировании в каталог, который уже содержит файлы (например, когда вы обычно используете cp -n «no clobber»).
Вы можете скопировать любую программу. В то же время вы можете запустить sudo iotop
и увидеть скорость чтения / записи на диске еще без прогресса.