Иначе, есть ли альтернативная утилита командной строки, которая может этого добиться?
Иначе, есть ли альтернативная утилита командной строки, которая может этого добиться?
Ответы:
Пока cp
нет этой функциональности, вы можете использовать pv
для этого:
pv my_big_file > backup/my_big_file
Примечание: этот метод потеряет права доступа и владение файлом. Файлы, скопированные таким образом, будут иметь те же права доступа, что и если бы вы их создали сами и принадлежали вам.
В этом примере, в pv
основном, просто выводится файл в stdout *, который вы перенаправляете в файл с помощью >
оператора. Одновременно он печатает информацию о прогрессе в терминал, когда вы делаете это.
Вот как это выглядит:
stefano@ubuntu:~/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
просто читает файл и печатает его на стандартный вывод). pv
точно так же, как cat, но если вы перенаправите его поток вывода куда-то еще, он вместо этого выведет информацию о прогрессе в stdout.
Посмотрите, man pv
чтобы узнать больше об этом.
Другой вариант, как DoR предлагает в этом ответе , - вместо этого использовать rsync:
$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
621.22M 57% 283.86MB/s 0:00:01
Это сохранит права доступа / владение файлами при отображении прогресса.
alias cp="rsync -avz"
cp устарел.
pv
, вы можете подглядывать /proc/PID of cp/fd
и /proc/PID of cp/fdinfo
выяснять прогресс. (Это зависит от вас, чтобы определить скорость.) Я использую эту технику, чтобы посмотреть updatedb
.
-z
вероятно, следует использовать только для сетевых копий; сжатие и распаковка данных для локальной копии - это просто накладные расходы.
rsync
убедитесь, что не добавляете трейлинг /
к исходному пути (или удаляете, если, например, bash complete помещает его туда автоматически). В противном случае вы получите результаты, отличные от использования cp
(или gcp
).
Нет Смотрите здесь, почему. Хотя он делает больше, чем нужно, 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)
-r
флаг для рекурсии каталогов. Это может даже быть псевдоним как прямая замена для cp:alias cp="rsync -ah --progress"
--progress
заставляет мою голову крутиться 🙃, наблюдая за всем выводом на дисплей в терминале. Таким образом, те, кто приходят сюда из поиска по ключевым словам AOL, rsync -ah --info=progress2 [source] [destination]
представляют результаты немного более вменяемым образом, ИМХО.
Если вы хотите увидеть , если ваши передачи файлов правильно , вы можете использовать gcp
и gcp
, как сП , но по умолчанию дает вам прогресс бар , так что вы можете увидеть , что копируется. Как отмечает вики программы , gcp
имеет несколько полезных функций, таких как
- индикация хода передачи
- непрерывное копирование при ошибке (перейти к следующему файлу)
- регистрация состояния копирования: gcp регистрирует все свои действия, чтобы можно было узнать, какие файлы были успешно скопированы
- изменение имени для обработки ограничений целевой файловой системы (например, удаление несовместимых символов "*" или "?" в 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
.
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
export DISPLAY=:0.0
перед запуском gcp. Если машина безголова, вам нужно запустить xsession в виртуальный фрейм-буфер или что-то в этом роде, в этот момент вам, вероятно, следует просто поискать другую программу
gcp
довольно прилично, но требование DBUS / X странно. Я справился с этим по SSH с помощью пересылки ssh: ssh -X user@host
и это позволило мне запустить его.
Я получаю удовольствие от использования cURL для этой цели. Страница man содержит список поддерживаемых протоколов «FILE», поэтому просто используйте его как любой другой протокол в URL:
curl -o destination FILE://source
Скорость, прогресс, оставшееся время и многое другое - все в привычном формате.
pv
, что он не будет сохранять разрешения.
Несмотря на то, что он не отображает скорость, при копировании нескольких файлов -v
опция для cp
команды предоставит вам информацию о ходе выполнения. например
cp -rv old-directory new-directory
Ядро знает большую часть данных, таких как скорость, и часто также процент. Современные ядра предоставляют это через файловую систему / proc.
ShowSpeed из https://github.com/jnweiger/showspeed использует эту информацию. Он может прикрепляться к уже запущенным программам и периодически давать обновления:
$ 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)
...
pkill -USR1 dd
чтобы dd
показать его состояние, другой вариант - watch -n 1 pkill -USR1 dd
периодически показывать его прогресс (каждую секунду).
В 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)
В то время как pv
может работать с локальными cp
задачами, использование dd
with 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 onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
Существует новый инструмент cv, который может найти любой дескриптор, связанный с запущенной командой, и показать прогресс и скорость: https://github.com/Xfennec/cv
cv -w
выводит статистику для всех запущенных операций cp, mv и т. д.
watch cv -q
еще аккуратнее
cp
копирует ли каталог рекурсивно или нет.
Как многие говорили, CP не включает эту функциональность.
Просто, чтобы бросить мои 0,02 доллара, что я обычно делаю в тривиальных ситуациях копирования (т.е. нет -R
):
Посмотрите, насколько большой файл и помните
Начать копирование
Откройте другой терминал
Запустите watch ls -lh DIR
каталог, в котором находится цель
Это может держать меня в курсе целевого размера файла, с минимальными хлопотами.
В качестве альтернативы для менее тривиальных ситуаций, например, рекурсивного копирования каталогов, вы можете использовать, watch du -hs DIR
чтобы увидеть сводку размера DIR. Однако для вычислений du может потребоваться много времени и даже замедлить копирование, поэтому вы можете использовать -n INTERVAL
аргумент для просмотра, чтобы компромисс был приемлемым.
Обновление: если вы используете подстановочные знаки с командой, используемой с watch du, например watch du -hs backup/*
, не забудьте процитировать:
watch "du -hs backup/*"
в противном случае дикие карты будут расширены только один раз , когда часы начали так дю не будет смотреть на новые файлы / подкаталоги.
dd status=progress
Опция добавлена в GNU Coreutils 8.24+ (Ubuntu 16.04):
dd if=src of=dst status=progress
Терминал показывает строку типа:
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
Смотрите также: Как вы контролируете прогресс дд?
Если у вас есть rsync 3.1 или выше ( rsync --version
), вы можете копировать (cp -Rpn) при сохранении разрешений и владения, повторять каталоги, «нет клоббера» и отображать общий прогресс (а не только прогресс по файлу), скорость копирования и ( очень грубо) расчетное время осталось с:
sudo rsync -a --info=progress2 --no-i-r /source /destination
Обратите внимание, что sudo требуется только в том случае, если вы имеете дело с каталогами / файлами, которые вам не принадлежат. Кроме того, без --no-i-r
, процент может быть сброшен до меньшего числа в некоторый момент во время копирования. Возможно, более поздние версии rsync по умолчанию будут no-ir с info = progress2, но в текущей версии 3.1.2 это не так.
Я обнаружил, что процент и оставшееся время сильно переоцениваются при копировании в каталог, который уже содержит файлы (например, когда вы обычно используете cp -n "no clobber").
Используйте скрипт оболочки:
#!/bin/sh
cp_p()
{
strace -q -ewrite cp -- "${1}" "${2}" 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' "${1}") count=0
}
Это будет выглядеть так:
% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================> ]
В зависимости от того, что вы хотите сделать, Midnight Commander ( mc
) может быть ответом. Я удивлен, что это еще не было упомянуто.
Инструменты вроде pv
или rsync
хороши для отображения прогресса передачи одного огромного файла, но когда дело доходит до копирования целых каталогов / деревьев, mc
вычисляет размер и затем очень хорошо отображает прогресс. Плюс он доступен из коробки на большинстве систем.
Еще один вариант сохранения атрибутов может быть (если source
это папка, в которой он будет создан destination
)
tar -c source | pv -e -t -p -r | tar -C destination -x
надеюсь, что это может быть полезно для кого-то. Чтобы рассчитать время передачи, это можно сделать, сделав do -s source
заранее и передав его в качестве -s <size>
параметра pv
.
-f -
избыточно tar
По умолчанию для вывода c
и ввода x
используются stdout и stdin.
Проверьте исходный код для progress_bar в приведенном ниже хранилище git
https://github.com/Kiran-Bose/supreme
Кроме того, попробуйте пользовательский пакет Баш скрипт верховная
Загрузите файл deb и установите его в дистрибутив Debian или загрузите исходные файлы, измените их и используйте для других дистрибутивов
Обзор функциональности
(1) Открытые приложения ---- Firefox ---- Калькулятор ---- Настройки
(2) Управление файлами ---- Поиск ---- Навигация ---- Быстрый доступ
|----Select File(s)
|----Inverse Selection
|----Make directory
|----Make file
|----Open
|----Copy
|----Move
|----Delete
|----Rename
|----Send to Device
|----Properties
(3) Управление телефоном ---- перемещение / копирование с телефона ---- перемещение / копирование на телефон ---- синхронизация папок
(4) Управление USB ---- перемещение / копирование с USB ---- перемещение / копирование на USB
pv знает, как смотреть дескрипторы файлов по pid, будь то cp или что-то еще
Из документации:
(Linux only): Watching file descriptor 3 opened by another process 1234:
pv -d 1234:3
(Linux only): Watching all file descriptors used by process 1234:
pv -d 1234
Пример:
md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============> ] 29% ETA 0:00:53
$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov: 754MiB 0:00:04 [97,2MiB/s] [======================> ] 52% ETA 0:00:07
4:/media/windows/copy.mov: 754MiB 0:00:04 [97,3MiB/s] [ <=> ]
pv
не обрабатывает разрешения так же, какcp
делает ... (на основе одного быстрого теста, который я пробовал:pv
не копировал бит выполнения через ...rsync
сделал.