0

I am trying to display size in human-readable form on HP-UX. We have a few legacy systems which we use for sftp transfers. These servers are connected T1 leased line and transfers are very slow. I have to occasionally check the size to verify if the transfer is done or not. As HP-UX cant display the size in kb or GB, we have to manually divide the output to verify. I am just trying to build a small script to display the size in GB.

read -p "Enter File Path/Location " location
output=$(ls -l $location | cut -d ' ' -f 18)
#output=$(ls -l /central/home/sftp/file.daily | cut -d ' ' -f 18)
echo "Size in GB is:  ${output}"
#echo "Size in GB is:  ${output} / (1024*1024*1024)"  not working "

bash-4.4$ ./script
Enter File Path/Location /central/home/sftp/file.daily
Size in GB is:  153844074
bash-4.4$ 

Guys/Gals, I am not a pro, just learning stuff to enhance my knowledge in bash scripting.

1337
  • 9
  • 4

1 Answers1

2

Your command echo "Size in GB is: ${output} / (1024*1024*1024)" is not working because the expression is just a string. To do calculations in bash, use an arithmetic context $(( ... )). However, bash cannot handle floating point numbers, therefore I'd resort to bc.

Also, ls | cut -f 18 seems a bit strange. This would retrieve the 18th field. The output of my ls -l has only 9 fields and the file size is the 5th field.
Instead of parsing ls you can parse du, which is simpler and less error prone. du -k prints the size in kB (= 1024 Byte).

#! /usr/bin/env bash
size_kB=$(du -k "$1" | cut -f 1)
size_GB=$(echo "scale=1; $size_kB / 1024 / 1024;" | bc)
echo "File $1 has size $size_GB GB"

Store this script in a executable file, then use it as

bash$ path/to/myscript.sh someFile
File someFile has size 12.3 GB

Passing the filename as an argument allows you to use tab completion. This wouldn't have been possible with read.

Socowi
  • 25,550
  • 3
  • 32
  • 54