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?
You need to remove the backtics around your
tar
command. You also might want to pipe thels
throughxargs
to make sure bash picks up all the directories correctly:The backticks are capturing the ouput of
tar
and attempting to execute that as a command in each iteration of the loop. The first thingtar
prints when you use a -v option is the permissions on each file (e.g. thedrwxrwxr-x
). In this case, you want bash to execute the tar command, not capture the output.bjlaub is correct regarding the backticks around
tar
, however you don't need to usels
:will do the trick and will properly handle directory names with spaces.
The other answers here are good, but I wanted to add another option in case you need to get just directories and not symbolic links, etc:
Hope this helps!