Tuesday, February 6, 2024

[SOLVED] Need a shell script that bzip2's every single file recursively from a certain folder

Issue

I know that this is really not my strong side to write those scripts. I need a shell script which recursively packs every single file in its folder into the .bz2 format because I have a lot of files and when I do this manually it takes me hours.

For example here are alot of files(much more then this example):

/home/user/data/file1.yyy
/home/user/data/file2.xxx
/home/user/data/file3.zzz
/home/user/data/file4.txt
/home/user/data/file5.deb
/home/user/data/moredata/file1.xyz
/home/user/data/muchmoredata/file1.xyx

And I need them all formated into .bz2 like this:

/home/user/data/file1.yyy.bz2
/home/user/data/file2.xxx.bz2
/home/user/data/file3.zzz.bz2
/home/user/data/file4.txt.bz2
/home/user/data/file5.deb.bz2
/home/user/data/moredata/file1.xyz.bz2
/home/user/data/muchmoredata/file1.xyx.bz2

Another thing that would be great when at then end the script will run one times chown -R example:example /home/user/data

I hope you can help me


Solution

bzip2 will accept multiple files as arguments on the command line. To solve your specific example, I would do

cd /home/user/
find . -type f | egrep -v '\.bz2' | xargs bzip2 -9 &

This will find all files under /home/user, exclude any already existing .bz2 files from processing, and then send the remaining list via xargs to bzip2. The -9 gives you maximum compression (but takes more time). There is no limit to the number or length of filenames that can be processed when using xargs to feed the command (in this case bzip2).

The & char means "run all of this in the background". This means the command prompt will return to you immediately, and you continue other work, but don't expect all the files to be compressed for a while. At some point you'll also get messages like 'Job %1 ... started' and later, 'Job %1 ... finished'.

As you asked for a script, we can also do this

#!/bin/bash
if [[ ! -d "$1" ]] ; then
   echo "usage: b2zipper /path/to/dir/to/search" 1>&2
   exit 1
if
find "$1" -type f | egrep -v '\.bz2' | xargs bzip2 -9 &

Save this as b2zipper, and then make it executable with

chmod +x b2zipper


Answered By - shellter
Answer Checked By - Clifford M. (WPSolving Volunteer)