I am a newbie to BASH so please dont mind my stupid questions because I am not able to get any good sources to learn that.
I want to create a script to display filename and its size. This is what the code is like
开发者_运维百科filename=$1
if [ -f $filename ]; then
filesize=`du -b $1`
echo "The name of file is $1"
echo "Its size is $filesize"
else
echo "The file specified doesnot exists"
fi
The output is like this
$ ./filesize.sh aa
The name of file is aa
Its size is 88 aa
But in the last line I don't want to show the name of the file. How do I do that ? I want to do the same thing using wc as well.
Use stat(1)
filename=$1
if [ -f $filename ]; then
filesize=`stat -c %s $1`
echo "The name of file is $1"
echo "Its size is $filesize"
else
echo "The file specified doesnot exists"
fi
See also man 1 stat
filesize=`du -b $1 | cut -f 1`
cut -f 1
splits its input by tabs and then outputs the first field (i.e. it returns each line of du
's output up to the fist tab character.).
All levels of question are accepted here.
You can use awk
to only get the first field:
du -b /path/to/file | awk '{print $1}'
Your script would then be something like:
filename=$1
if [ -f ${filename} ]; then
filesize=$(du -b ${filename} | awk '{print $1}')
echo "The name of file is ${filename}"
echo "Its size is ${filesize}"
else
echo "The file specified does not exists"
fi
You'll notice I've changed a couple of other things as well:
- I prefer
$(X)
to `X` for capturing output of command simply because they're easier to nest. - If you've already put
$1
into$filename
, you may as well use$filename
from that point on (the$1
in theawk
is a different beast). - I prefer to put all my variables inside
${}
so that it's obvious to both the reader and the shell that${var}X
is$var
appended withX
, rather than $varX being the non-existent ${varX}.
These are really personal preferences but, as with all my personal preferences, I consider them best practices for the entire IT industry :-)
You could use awk to split the output of du at the first space, as follows:
filesize=`du -b $1 | awk '{ print $1; }'`
Instead of using du -b $1
use du -b $1 | cut -f 1
. It will only include the first field of output of du command, therefore only reporting the size of the file.
You can use awk to pick out the first column of data.
filesize=`du -b $1 | awk '{print $1}'`
精彩评论