Bash one-liner loop over directories throws errors

bashscriptingtar

I'm trying to build a bash one-liner to loop over the directories within the current directory and tar the content into unique tars, using the directory name as the tar file name. I've got the basics working (finding the directory names, and tarring them up with those names) but my loop tosses some error messages and I can't understand where it's getting the commands its trying to run.

Here's the mostly-working one-liner:

for f in `ls -d */`; do `tar -czvvf ${f%/}.tar.gz $f`;done

The "strange" output is:

-bash: drwxrwxr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxrwxr-x: command not found

What portion of the command that I'm running do I not understand and that's generating that output?

Best Answer

You need to remove the backtics around your tar command. You also might want to pipe the ls through xargs to make sure bash picks up all the directories correctly:

for f in `ls -d */ | xargs`; do tar -cvzf ${f%/}.tar.gz $f; done

The backticks are capturing the ouput of tar and attempting to execute that as a command in each iteration of the loop. The first thing tar prints when you use a -v option is the permissions on each file (e.g. the drwxrwxr-x). In this case, you want bash to execute the tar command, not capture the output.

Related Topic