Bash script help
Hello, all.
I'm creating a bash script to check how much free space is left in /var directory then, if it hits a certain threshold, delete certain files with numbers for extensions (e.g. fileA.1, fileA.2 fileA.3, and fileA.4, fileB.1, fileB.2 fileB.3, and fileB.4 ). Here's a snippet from my script: if [ $PARTUSE -ge $ALERT ]; then cat /dev/null > /var/log/fileA.* 2>&1 && cat /dev/null > /var/log/fileB.* 2>&1 && cat /dev/null > /var/log/fileC.* 2>&1 && echo "Reclaimed disk space on \"$PARTITION\" now ($PARTUSE% full) on $(hostname) as of $(date)" | mail -s "Reclaimed disk space - $PARTITION on $(hostname)" $ADMIN fi If I use a * as a wildcard for the number extension, the script fails. Maybe regex would work here, but I'm not particularly accomplished at it. Or some other construct. Your help would be most appreciated. Diggy |
You cannot redirect the standard output to multiple files at once. You can use a loop to empty every single file, e.g.
Code:
for file in /var/log/fileA.? /var/log/fileB.? /var/log/fileC.? |
Quote:
|
Quote:
|
colucix,
I used a poor example (apologies) in decribing what I want to do. I really want to delete files along the lines of Afile.1, Afile.2, Bfile.1, Bfile.2. Given that, How would I write the construct you suggested if, in fact, it would still work in this case? Diggy |
Quote:
Too risky? May it's not so clear (to me!) the phrase Quote:
|
I don't want to destroy the files, just empty them of content.
Diggy |
Quote:
Code:
> $file |
Quote:
Code:
> file |
colucix,
I'm sure that your solution 1) works, and 2) is "elegant". I (ashamedly) just don't have a lot of scripting experience. That said, would my entire script look like this?: #!/bin/bash # # Shell script to reclaim disk space # It will clear out certain files if the percentage of partition space used is >= % set in ALERT variable, # thus reducing partition size, and will send an email to the system administrator(s) # ------------------------------------------------------------------------- # Written by Me # ------------------------------------------------------------------------- # # set admin email address(es) ADMIN="root@localhost" # # set alert level at 90%. If used space exceeds this, send alert ALERT=80 # # check partition space and, if necessary, send alert df -H | grep '/var' | awk '{ print $5 " " $6 }' | while read output; do PARTUSE=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) PARTITION=$(echo $output | awk '{ print $2 }' ) if [ $PARTUSE -ge $ALERT ]; then for file in /var/log/Afile.? /var/log/Bfile.? /var/log/Bfile.? do > $file done && echo "Reclaimed disk space on \"$PARTITION\" now ($PARTUSE% full) on $(hostname) as of $(date)" | mail -s "Reclaimed disk space - $PARTITION on $(hostname)" $ADMIN fi done Please bear with me, I'm learning, and this will be invaluable. Diggy |
Quote:
Regarding your script it looks good. I would avoid some redundancy, anyway. For example, to extract the usage of the /var partition you might use a more compact code. In place of: Code:
df -H | grep '/var' | awk '{ print $5 " " $6 }' | while read output Code:
df -P | awk '/\/var/{ sub(/%/,"",$5); print $5, $6 }' | while read PARTUSE PARTITION
Finally I don't see the need for a while loop, since you're reading a single line. To assign the output of a command using the read statement, process substitution is your friend: Code:
read PARTUSE PARTITION < <(df -P | awk '/\/var/{ sub(/%/,"",$5); print $5, $6 }') |
What you suggest looks just fine, but I'm not sure how the final product would look. Based on my knowledge, and the suggestions in your last post, I'm not seeing where/how the files are being concatenated.
I understand that this piece: df -P | awk '/\/var/{ sub(/%/,"",$5); print $5, $6 }' | while read PARTUSE PARTITION do replaces: df -H | grep '/var' | awk '{ print $5 " " $6 }' | while read output do PARTUSE=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) PARTITION=$(echo $output | awk '{ print $2 }' ) After the "do" statement, do I place my email alert piece? What handles the actual file concatenation? I'm a bit confused, and feeling not just a little stupid. Diggy |
It simply replaces the extraction of information from the df output and it does the assigment to PARTUSE and PARTITION in a different way, but the rest stays untouched:
Code:
#!/bin/bash |
I apologize, again. I didn't mean to have you write this for me. But, now I get it. I'll test in a while, and report back. Thanks for your patience!!
Diggy |
You're welcome! :)
|
All times are GMT -5. The time now is 06:40 AM. |