HiveBrain v1.2.0
Get Started
← Back to all entries
patternbashMinor

Script to monitor a folder and compress the content

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
scriptthecompressfoldermonitorandcontent

Problem

We have a Debian Squeeze server where we upload files through SFTP, and I wrote this script to automatically compress uploaded files.

The script is scheduled through a cron job in an unprivileged user's crontab.

As of now, the script works and does its job.

But I'm pretty novice to Bash scripting, and I'm wondering if it has any major flaws. (e.g. If the file name contains " what happens? Does it have security flaws?)

Also, am I doing it right, or there are better ways to do it?

#!/bin/bash

# Use the newline character
# as the field separator.
IFS=$'\n'

# The folder to watch.
dir="/path"

# Get the folder's content, recurively.
for item in $(find "${dir}")
do

# If the item is a regular file.
if [ -f "${item}" ]
then

# Check if the file is in use
# by someone else. E.g. The SFTP
# daemon because the user is still
# uploading it.
lsof -n "${item}" > /dev/null

# If no one is using the file.
if [ "$?" -ne 0 ]
then

# Get the file extension.
ext=$(echo "${item}" | awk -F "." '{ print $NF }')

# If the file is not a zip archive
# and does not exists a zip archive for it
if [ "${ext}" != "zip" -a ! -f "${item}.zip" ]
then
# Create the zip archive.
zip "${item}.zip" "${item}" > /dev/null
fi

fi

fi

done

Solution

Slightly different than @kojiro's answer, using find for everything:

find /path \
     -type f \
     ! -iname "*.zip" \
     ! -exec /usr/sbin/lsof -n "{}" \; \
     ! -exec test -f "{}.zip" \; \
     -exec zip -q "{}.zip" "{}" \; \
     -exec rm "{}" \;


(last step only if the removal of the original is required).

Code Snippets

find /path \
     -type f \
     ! -iname "*.zip" \
     ! -exec /usr/sbin/lsof -n "{}" \; \
     ! -exec test -f "{}.zip" \; \
     -exec zip -q "{}.zip" "{}" \; \
     -exec rm "{}" \;

Context

StackExchange Code Review Q#9334, answer score: 5

Revisions (0)

No revisions yet.