Иначе, есть ли альтернативная утилита командной строки, которая может этого добиться?
Хотя 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
просто читает файл и распечатывает его в stdout). pv
похож на кошку, но если вы перенаправите его в другое место, он распечатает информацию о прогрессе в 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
Это позволит сохранить права/владение файлами при отображении прогресса.
Вы можете скопировать любую программу. В то же время вы можете запустить sudo iotop
и увидеть фактическую скорость чтения / записи диска, но без прогресса.
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] [ <=> ]
satu lagi pilihan untuk memelihara atribut mungkin (jika sumber
adalah folder maka ia akan dibuat di destinasi
)
tar -c source | pv -e -t -p -r | tar -C destination -x
harap mungkin berguna kepada seseorang. Untuk menganggarkan masa pemindahan ini dapat dicapai dengan melakukan sumber do -s
terlebih dahulu dan meneruskannya sebagai parameter -s
ke pv
.
Используйте сценарий оболочки:
#!/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
, подходят для d isplay прогресс передачи одного огромного файла, но когда дело доходит до копирования целых каталогов / деревьев, mc
вычисляет размер и затем очень хорошо отображает процесс. Кроме того, он доступен "из коробки" в большинстве систем.
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
, которая регулярно обновляется.
См. Также: Как вы отслеживаете прогресс dd?
Есть новый инструмент cv, который может найти любой дескриптор, связанный с выполняющейся командой, и показать прогресс и скорость: https://github.com/Xfennec/cv
cv -w
выводит статистику для всех запущенных операций cp, mv и т. Д.
Проверьте исходный код progress_bar в нижеприведённом git-репозитории
https://github. com/Kiran-Bose/supreme
Также попробуйте пользовательский пакет сценариев bash supreme
Загрузите deb-файл и установите его в дистрибутив debian или загрузите файлы исходного кода, модифицируйте и используйте для других дистрибутивов
Обзор функциональности
(1)Открытые приложения ----Firefox ----Калькулятор ----Settings
(2)Manage Files ----Поиск ----Навигация ----Скоростной доступ
|----Select File(s)
|----Inverse Selection
|----Make directory
|----Make file
|----Open
|----Copy
|----Move
|----Delete
|----Rename
|----Send to Device
|----Properties
(3)Управление телефоном ----Приглашение/копия с телефона ----Приглашение/копия на телефон ----Синхронизация папок
(4)Управление USB ----Move/Copy from USB ----Move/Copy to USB
Если у вас есть rsync 3.1 или выше ( rsync --version
), вы можете скопировать (cp -Rpn) с сохранением разрешений и прав собственности, рекурсивные каталоги, "no clobber , "и отображать общий прогресс (а не только по файлам), скорость копирования и (очень приблизительное) оставшееся время:
sudo rsync -a --info=progress2 --no-i-r /source /destination
Обратите внимание, что sudo требуется только при работе с каталогами / файлами, которые вам не принадлежат. Кроме того, без - no-i-r
процентное значение может сбрасываться до более низкого значения в какой-то момент во время копирования. Возможно, более поздние версии rsync по умолчанию будут использовать no-i-r с info = progress2, но это не так в текущей версии 3.1.2.
Я обнаружил, что процент и оставшееся время сильно завышены при копировании в каталог, который уже содержит файлы (например, когда вы обычно используете cp -n "no clobber").
Как многие говорили,cp не включает эту функцию.
Просто чтобы выбросить мои 0,02 доллара, что я обычно делаю с тривиальными ситуациями копирования (например, без -R
):
Посмотрите, насколько велик файл, и запомните
Начать копирование
Открыть другой терминал
Запустить watch ls -lh DIR
в каталоге, где целевой является
Это может держать меня в курсе о размере целевого файла с минимальными усилиями.
В качестве альтернативы для менее тривиальных ситуаций, например рекурсивно копируя каталоги, вы можете использовать watch du -hs DIR
, чтобы увидеть сводку размера DIR. Однако вычисление du может занять много времени и может даже замедлить копирование, поэтому вы можете использовать аргумент -n ИНТЕРВАЛ
для наблюдения, чтобы компромисс был приемлемым.
Обновление: В если вы используете подстановочные знаки с командой, используемой с watch du, например watch du -hs backup / *
, не забудьте процитировать:
watch "du -hs backup/*"
иначе подстановочные знаки будут раскрыты только один раз , когда часы запущены , поэтому du не будет смотреть на новые файлы / подкаталоги.
В то время как pv
может работать с локальными задачами cp
, используя dd
с pv
может обрабатывать как локальные ( cp
), так и удаленные ( scp
) задачи.
dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv
Убедитесь, что путь / 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
В репозиториях есть инструмент под названием 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)
Ядро знает большую часть данных, таких как скорость, а часто и проценты. Современные ядра раскрывают это через свою файловую систему /proc.
show speed from 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)
...
Хотя он не отображает скорость, при копировании нескольких файлов, опция -v
для команды cp
предоставит вам информацию о ходе выполнения. Например,
cp -rv old-directory new-directory
Я получаю удовольствие от использования cURL именно для этой цели. На странице руководства указан протокол "FILE" как поддерживаемый, поэтому просто используйте его как любой другой протокол в URL:
curl -o destination FILE://source
Скорость, прогресс, оставшееся время и многое другое - все в знакомом формате.
Нет. См. здесь , чтобы узнать, почему. Хотя он делает больше, чем вам нужно, 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 регистрирует все свои действия, чтобы можно было узнать, какие файлы были успешно скопированы
- изменение имени для обработки ограничений целевой файловой системы (например, удаление несовместимых символов «*» или «?» в FAT)
Однако , даже когда индикатор выполнения достиг 100% при использовании инструмента, вы должны дождаться, пока снова не появится приглашение терминала, прежде чем безопасно извлекать носитель, чтобы вы могли убедиться, что процесс передачи успешно завершен.
gcp
используется для копирования файлов и имеет такие параметры, как - сохранить
, чтобы можно было сохранить различные атрибуты и разрешения, и - рекурсивный
, чтобы можно было копировать целые каталоги. Более подробную информацию о его параметрах можно найти, введя 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
.
Вы можете следить за прогрессом, используя watch
cp -r /path/to/your/file/or/dir ./dst
, а во втором терминале вы можете следить за прогрессом
watch -n 0.1 du -h --max-depth=1
Установить gcp
sudo apt-get install gcp
ПРИМЕЧАНИЕ. Убедитесь, что у вас включена поддержка X11, если нет: Добавьте следующую строку в '/ etc / ssh / sshd_config'
ForwardX11Trusted yes
Установить
sudo apt-get install xauth
reboot
Когда все будет готово:
gcp -rv SOURCE_FOLDER DESTINATION_FOLDER
или:
gcp SOURCE_FILE DESTINATION_FILE
Поскольку исходный cp linux не имеет этой функциональности, я использовал следующее решение для получения информации о ходе выполнения:
cp -a source_directory destination_direcotry
Во время работы копии создайте другой командный терминал и перейдите в исходный_директорию как:
cd source_directory
du -sm .
После того, как я получил общий размер source_directory, затем перейду к destination_direcotry, чтобы проделать ту же работу:
cd destination_direcotry
du -sm .
Я мог получить информацию о ходе копирования, сравнив общую разницу в размере между destination_direcotry и source_directory, единственной дополнительной работой вам нужно открыть другой терминал, помимо терминала cp, и набрать "du -sm". чтобы получить общий размер копируемого каталога.
Здесь уже есть несколько действительно отличных ответов, но вот мои любимые команды, включая мой собственный небольшой поворот в команде rsync
, с моими любимыми параметрами:
watch 'du -hs'
позволяет вам наблюдать за увеличением размера целевой папки, если cp
уже запущен: Что делать, если вы уже запустили длинный cp
и не хотите останавливать его сейчас?
Предположим, вы уже запустили эту команду копирования:
# recursively copy source_dir_name to destination
cp -r source_dir_name destination
Просто откройте новый терминал с уже выполняющейся операцией копирования и запустите:
# cd into destination directory
cd path/to/destination/source_dir_name
# Now watch, live, the size of this destination grow!
watch 'du -hs'
Это вызовет команда watch
для автоматического запуска du -hs
каждые 2 секунды (по умолчанию для watch
) внутри вашего целевого каталога, чтобы вы могли видеть размер папки расти в реальном времени! Это не дает вам процент завершения, но если у вас есть приблизительное представление о размере того, что вы копируете, это, безусловно, дает вам что-то, на что можно смотреть и чувствовать себя хорошо, зная, что цель растет. Вот пример вывода на экран часов:
Каждые 2,0 с: du -hs 2.5G.
Здесь вы можете увидеть, что текущий размер текущего каталога (.
) составляет 2,5 ГиБ. Чтобы часы использовали более медленный интервал обновления, например 5 секунд, просто добавьте -n 5
к команде watch
, например:
watch -n 5 'du -hs'
rsync
действительно лучше всего подходит для этого: Мои любимые команды:
# dry-run
time rsync -rah --dry-run --info=progress2 --stats source destination
# real copy (Important! Do a dry run first and read the
# output summary to ensure you're copying what you intend!)
time rsync -rah --info=progress2 --stats source destination
Примечание: часть time
перед вышеприведенными командами просто выводит красивую временную сводку общего время выполнения операции в конце. Это работает перед любой командой Linux.
Вот как выглядит сводка rsync
- stats
для - пробного запуска
, между прочим:
$ rsync -rah --dry-run --info = progress2 --stats / media / gabriel / cdrom ~ / temp 2,76 ГБ 100% 2570,10 ГБ / с 0:00:00 (xfr # 3836, to-chk = 0/4837) Количество файлов: 4837 (рег: 3,836, каталог: 1001) Количество созданных файлов: 0 Количество удаленных файлов: 0 Количество переданных обычных файлов: 3836 Общий размер файла: 2,76 ГБ Общий размер переданного файла: 2,76 ГБ Литеральные данные: 0 байт Соответствующие данные: 0 байт Размер списка файлов: 0 Время создания списка файлов: 0,001 секунды Время передачи списка файлов: 0,000 секунд Всего отправлено байт: 123,88K Всего получено байт: 15.54K отправлено 123,88 Кбайт получено 15,54 Кбайт 278,85 Кбайт / сек общий размер - 2,76G, ускорение - 19792,78 (СУХОЙ ЗАПУСК)
rsync
и прочее: https://superuser.com/questions/1271882/convert-ntfs-partition-to-ext4 -how-to-copy-the-data / 1464264 # 1464264 Не идеальный вариант вы можете открыть второй терминал и сделать
while true; do ls -lh [location/filename]; sleep 2; clear; done
Он покажет вам файл в читаемом человеком формате, и вы можете наблюдать, как размер файла становится больше. Я делаю это, когда не могу установить новые утилиты на компьютере.