Linux check file sizes

How can I check the size of a file using Bash?

I’ve got a script that checks for 0-size, but I thought there must be an easier way to check for file sizes instead. I.e. file.txt is normally 100 kB; how can I make a script check if it is less than 90 kB (including 0), and make it Wget a new copy because the file is corrupt in this case? What I’m currently using.

if [ -n file.txt ] then echo "everything is good" else mail -s "file.txt size is zero, please fix. " myemail@gmail.com < /dev/null # Grab wget as a fallback wget -c https://www.server.org/file.txt -P /root/tmp --output-document=/root/tmp/file.txt mv -f /root/tmp/file.txt /var/www/file.txt fi 

Title of question should be changed. This is about detecting zero size files, not about checking the size of a file.

12 Answers 12

[ -n file.txt ] doesn't check its size. It checks that the string file.txt is non-zero length, so it will always succeed.

If you want to say "size is non-zero", you need [ -s file.txt ] .

To get a file's size, you can use wc -c to get the size (file length) in bytes:

file=file.txt minimumsize=90000 actualsize=$(wc -c <"$file") if [ $actualsize -ge $minimumsize ]; then echo size is over $minimumsize bytes else echo size is under $minimumsize bytes fi 

In this case, it sounds like that's what you want.

But FYI, if you want to know how much disk space the file is using, you could use du -k to get the size (disk space used) in kilobytes:

file=file.txt minimumsize=90 actualsize=$(du -k "$file" | cut -f 1) if [ $actualsize -ge $minimumsize ]; then echo size is over $minimumsize kilobytes else echo size is under $minimumsize kilobytes fi 

If you need more control over the output format, you can also look at stat . On Linux, you'd start with something like stat -c '%s' file.txt , and on BSD and Mac OS X, something like stat -f '%z' file.txt .

Use wc -c < "$file" (note the < ), in which case you don't need the | cut . part (which, as posted, doesn't work on OSX). The minimum BLOCKSIZE value for du on OSX is 512 .

Is it not inefficient to read the file to determine it's size? I think stat will not read the file to see it's size.

@PetriSirkkala On my Linux system, wc -c

stat can also check the file size. Some methods are definitely better: using -s to find out whether the file is empty or not is easier than anything else if that's all you want. And if you want to find files of a size, then find is certainly the way to go.

I also like du a lot to get file size in kb, but, for bytes, I'd use stat :

size=$(stat -f%z $filename) # BSD stat size=$(stat -c%s $filename) # GNU stat? 

The difference between GNU and BSD is what, unfortunately, makes this alternative a bit less attractive. 🙁

stat can be misleading if the file is sparse. You could use the blocks reported by stat to calculate space used.

@AjithAntony That's an interesting point which did not occur to me. I can see stat being the right thing in some situations, and sparse files are not relevant in most situations, though certainly not all.

An alternative solution with AWK and double parenthesis:

FILENAME=file.txt SIZE=$(du -sb $FILENAME | awk '< print $1 >') if ((SIZE<90000)) ; then echo "less"; else echo "not less"; fi 

Nice, but won't work on OSX, where du doesn't support -b . (It may be a conscious style choice, but just to mention the alternative: you can omit the $ prefix inside (( . )) when referencing variables: ((SIZE<90000)) )

Читайте также:  Linux задать ip адрес командой

@fstab, you may ommit awk by using read ( bash internal command): read SIZE _ <<<$(du -sb "$FILENAME")

If your find handles this syntax, you can use it:

find -maxdepth 1 -name "file.txt" -size -90k 

This will output file.txt to stdout if and only if the size of file.txt is less than 90k. To execute a script script if file.txt has a size less than 90k:

find -maxdepth 1 -name "file.txt" -size -90k -exec script \; 

+1, but to also make it work on OSX, you need an explicit target directory argument, e.g.: find . -maxdepth 1 -name "file.txt" -size -90k

If you are looking for just the size of a file:

wc -c "$file" was given as an answer in 2011 (three years ago). Yes, wc -c "$file" has the problem that it outputs the file name as well as the character count, so the early answers added a command to separate out the count. But wc -c < "$file" , which fixes that problem, was added as a comment in May 2014. Your answer is equivalent to that, except it adds a “useless use of cat ”. Also, you should quote all shell variable references unless you have a good reason not to.

You can make this more efficient by using head -c instead of cat.if [ $(head -c 90000 $file | wc -c) -lt 90000 ] ; then echo "File is smaller than 90k" ; fi . Tested on CentOS, so it may or may not work on BSD or OSX.

This works in both Linux and macOS:

function filesize < local file=$1 size=`stat -c%s $file 2>/dev/null` # Linux if [ $? -eq 0 ] then echo $size return 0 fi eval $(stat -s $file) # macOS if [ $? -eq 0 ] then echo $st_size return 0 fi return -1 > 
python -c 'import os; print (os.path.getsize(". filename . "))' 

It is portable, for all flavours of Python, and it avoids variation in stat dialects.

But the question was about checking for a file size threshold, e.g. 100 KB, not just getting the file size.

For getting the file size in both Linux and Mac OS X (and presumably other BSD systems), there are not many options, and most of the ones suggested here will only work on one system.

what does work in both Linux and Mac's Bash:

size=$( perl -e 'print -s shift' "$f" ) 

The other answers work fine in Linux, but not in Mac:

  • du doesn't have a -b option in Mac, and the BLOCKSIZE=1 trick doesn't work ("minimum blocksize is 512", which leads to a wrong result)
  • cut -d' ' -f1 doesn't work because on Mac, the number may be right-aligned, padded with spaces in front.

So if you need something flexible, it's either perl 's -s operator , or wc -c piped to awk '' (awk will ignore the leading white space).

And of course, regarding the rest of your original question, use the -lt (or -gt ) operator:

if [ $size -lt $your_wanted_size ]; then , etc.

+1; if you know you'll only be using the size in an arithmetic context (where leading whitespace is ignored), you can simplify to size=$(wc -c < "$f") (note the < , which causes wc to only report a number). Re comparison: don't forget the more "bash-ful" if (( size < your_wanted_size )); then . (and also [[ $size -lt $your_wanted_size ]] ).

Based on gniourf_gniourf’s answer,

will write file.txt to stdout if and only if the size of file.txt is less than 90K, and

find "file.txt" -size -90k -exec command \;

will execute the command command if file.txt has a size less than 90K. I have tested this on Linux. From find(1) ,

… Command-line arguments following (the -H , -L and -P options) are taken to be names of files or directories to be examined, up to the first argument that begins with ‘-’, …

assuming that ls command reports filesize at column #6

Читайте также:  Лучшие драйвера для linux

But the question was about checking for a file size threshold, e.g. 100 KB, not just getting the file size.

I would use du 's --threshold for this. Not sure if this option is available in all versions of du but it is implemented in GNU's version.

-t, --threshold=SIZE exclude entries smaller than SIZE if positive, or entries greater than SIZE if negative 

Here's my solution, using du --threshold= for OP's use case:

THRESHOLD=90k if [[ -z "$(du --threshold=$ file.txt)" ]]; then mail -s "file.txt size is below $, please fix. " myemail@gmail.com < /dev/null mv -f /root/tmp/file.txt /var/www/file.txt fi 

The advantage of that, is that du can accept an argument to that option in a known format - either human as in 10K , 10MiB or what ever you feel comfortable with - you don't need to manually convert between formats / units since du handles that.

For reference, here's the explanation on this SIZE argument from the man page:

The SIZE argument is an integer and optional unit (example: 10K is 10*1024). Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB. (powers of 1000). Binary prefixes can be used, too: KiB=K, MiB=M, and so on. 

Источник

How to find the file size in Linux

In this article, we will look at how to get the file size in UNIX-like operating systems using a variety of command-line utilities. We will be using two commands to get it done.

How to find the file size in Linux

List of content you will read in this article:

Obtaining file information on a regular basis is critical because, before assigning extra space, you must determine which files are using up the most space and which files are unnecessary and taking up a lot of space. In Linux, we have a variety of tools to check this. In this article, we'll look at a few different ways to verify the file size in Linux using the command line.

What is File

A file is a container for keeping any data in a computer system on a hard disk. Computer files have many of the same characteristics as paper documents in the library and office folders. There are many distinct sorts of files, including data files, text files, media files, and binary files, all of which hold different data types. Files can be saved on optical discs, hard drives , or other kinds of feasible storage media in a computer operating system.

What is File System in Linux

The Linux file system has a ranked file structure because it has a root directory and subdirectories. The root directory has all of the other guides. Normally, a partition has just one file system, but it might have many. A file system is constructed in such a way that it can handle and store non-volatile data. Non-volatile storage refers to data that does not vanish when turned off the computer. Every file system needs a namespace, which is the technology and architecture that will be used to store the files. The namespace specifies the naming procedure, file name length, or a subset of characters that can be used in the file name. It also shows how files on a memory segment are organized logically, such as using directories to organize certain files. Once a namespace has been formed, a Metadata description for that specific file must be defined. To communicate with file system components such as files and directories, an API (application programming interface) is required. Creating, deleting, and copying files are all made easier using API. It simplifies an algorithm that determines how files are organized on a file system. API acts as a middleman between the user and the operating system's hardware, which is written in assembly language. Users make requests to the API in high-level languages, which are subsequently processed by the API as needed.

Читайте также:  Astra linux rdp клиент

Different ways to get file size in Linux

As we explore different ways to retrieve file sizes in Linux, it's essential to have a reliable Linux VPS. Check out MonoVM's Linux VPS offerings for robust and scalable solutions tailored to your needs.

ls command

The 'ls' command is perhaps one of the most often used commands on the command line in Linux. It means "to list," as in "to list the files and folders from my current location." It's approximately the same as the DOS/Windows command line option 'dir'. The man page for 'ls' will provide you with a wide variety of options that you can use with this command. Let's take a look at a few that show you the file size.

The -l options are used to get the size of the specified file.

-l options are used to get the size of all the files in the current directory.

-al option is used to get the size of all the files, including hidden files in the current directory.

-h option prints human-readable sizes of the files.

What are environment variables ?

Environment variables are terms that are utilized by practically every command you execute and are considered to have a specific value. For example, suppose you need to know the installation path of a certain installed package, such as python, to run a command. Set the environment variable to point to the python 2.7 installation path, and any subsequent calls to 'python' from the terminal will resolve to that path. Now, if you suddenly wish to utilize Python 3 for all of your future needs, you must alter the environment variable to refer to Python 3's installation path.

How du command decides block size

The du command examines the following environment variables to determine the block size to use: DU BLOCK SIZE, BLOCK SIZE, BLOCKSIZE are all terms for referring to the same thing. If any of these exist, the block size is set, and du stops checking. If none are specified, du uses a block size of 1,024 bytes by default. On the other hand, Du defaults to a block size of 512 bytes if the environment variable POSIXLY_CORRECT is set in your system.

du command

The command du is used to obtain information about the disc utilization of specific files and folders. It works best with certain folders and has a lot of options for customizing the output to match your requirements. It usually gives the detail of sizes in terms of blocks.

Print file sizes in human-readable form

Get memory allocated summary of the file or the directory.

Getting file sizes in blocks

The block parameter can be used to provide a block size for du for the current operation. To determine the actual sizes of the directories and files using a one-byte block size, use the following command:

If you wish to utilize a one-megabyte block size, use the below command:

Print directories and files' details in the tree form starting from the root directory. This means that all the files in the root directory would be printed first. Later, the files in the sub-directories of the root directories would be printed and so on.

Using the -d (max depth) option and a depth value as an input, you may instruct du to list the directory tree to a specific depth.

Conclusion

In this article, we looked at how to get the file size in UNIX-like operating systems using a variety of command-line utilities. We went through the ls command and its different parameters before moving on to the du command, which is used to determine the disc usage of certain files or directories.

People also read:

Источник

Оцените статью
Adblock
detector