Печать размера суммы скопированных файлов в ударе

Используйте. netstat -anp | grep ':6016' Это даст вам pid процесса, подключенного к порту. Затем используйте ps aux | grep , чтобы получить имя пользователя, под которым запущен процесс.

3
09.09.2018, 19:11
4 ответа

Чтобы сэкономить на арифметике в вашем скрипте, вы можете просто взять размер конкатенации файлов:

cat *.tiff | wc

Ядро UN *X будет сотрудничать с вами, чтобы сделать это столь же эффективным, как и измерение размеров файлов по отдельности.

0
27.01.2020, 21:25
size=$(wc -c < ${i})    

Это не очень умный способ получить размер файла. Запуск wcтаким образом потребует чтения всего файла, что на самом деле совершенно не нужно, поскольку все, что вам нужно, это размер, который файловая система уже знает и может сообщить вам.

Это смягчается тем фактом, что вы копируете файл впоследствии, и поэтому его необходимо прочитать в любом случае. Файл среднего размера -, вероятно, останется в кеше в течение всего времени, поэтому операции чтения фактически не попадают на диск. Но все же, было бы разумно просто прочитать размер.

С помощью утилит GNU вы можете получить размер файла с помощью stat -c %s "$filename". К сожалению, параметры statв других системах отличаются, и я не думаю, что есть лучший, более портативный способ (, кроме запуска Perl )

.
cp -v ${i} $out | sleep 1 | echo -ne "$size%\033[0K\r"

Здесь конвейер кажется странным. cpне производит никакого вывода (на стандартный вывод ), по крайней мере, без -i, поэтому нечего передавать. Даже если бы это было так,sleepничего не читает, поэтому любой вывод из cpбудет потрачен впустую. То же самое происходит между sleepи echo. Это в основном полная противоположность тому, для чего обычно используются конвейеры, но это приводит к тому, что все команды выполняются параллельно, и оболочка ожидает завершения всех из них, поэтому для запуска конвейера требуется не менее одной секунды. независимо от того, насколько быстрой в противном случае была бы копия.

Если вы хотите суммировать размеры файлов, возможно, вам понадобится арифметическое расширение оболочки $((.. )). Итак, без лишних снов:

dest=/path/to/destination
total=0
for file in *.tiff; do
    size=$(stat -c %s "$file");
    printf "current %d total %d\n" "$size" "$((total += size))"
    cp -- "$file" "$dest"
done
1
27.01.2020, 21:25

Можно суммировать с +=, если переменная объявлена ​​как целое:

$ declare -i size
$ size+=100; echo "$size"
100
$ size+=200; echo "$size"
300

Ваш скрипт (с правильными расширениями переменных процитирован):

#!/bin/bash
input_folder=./a/b/c
output_folder=./d/e/f
declare -i size

for i in "$input_folder"/*; do
  size+=$(wc -c < "${i}")    
  cp -v "${i}" "$output_folder" | sleep 1 | echo -ne "$size\033[0K\r"
done
0
27.01.2020, 21:25

Просто суммируйте отдельные размеры и echoпотом.

#!/bin/bash
input_folder=/a/b/c
output_folder=/d/e/f

cd $input_folder

size_sum=0    
for i in *.tiff; do
  size=$(wc -c < ${i})    
  size_sum=$((size_sum + size))
  cp -v ${i} $out | sleep 1 
done

echo ${size_sum}
1
27.01.2020, 21:25

Теги

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