I typically do:
tar -czvf my_directory.tar.gz my_directory
What if I just want to include everything (including any hidden system files) in my_
tar -C my_dir -zcvf my_dir.tar.gz `ls my_dir`
Use pax.
Pax is a deprecated package but does the job perfectly and in a simple fashion.
pax -w > mydir.tar mydir
function tar.create() {
local folder="${1}"
local tar="$(basename "${folder}")".tar.gz
cd "${folder}" && tar -zcvf "../${tar}" .; cd - &> /dev/null
}
Example:
tar.create /path/to/folder
You are welcome.
You can also create archive as usual and extract it with:
tar --strip-components 1 -xvf my_directory.tar.gz
This Answer should work in most situations. Notice however how the filenames are stored in the tar file as, for example, ./file1
rather than just file1
. I found that this caused problems when using this method to manipulate tarballs used as package files in BuildRoot.
One solution is to use some Bash globs to list all files except for ..
like this:
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
This is a trick I learnt from this answer.
Now tar will return an error if there are no files matching ..?*
or .[^.]*
, but it will still work. If the error is a problem (you are checking for success in a script), this works:
shopt -s nullglob
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
shopt -u nullglob
Though now we are messing with shell options, we might decide that it is neater to have *
match hidden files:
shopt -s dotglob
tar -C my_dir -zcvf my_dir.tar.gz *
shopt -u dotglob
This might not work where your shell globs *
in the current directory, so alternatively, use:
shopt -s dotglob
cd my_dir
tar -zcvf ../my_dir.tar.gz *
cd ..
shopt -u dotglob
I would propose the following Bash function (first argument is the path to the dir, second argument is the basename of resulting archive):
function tar_dir_contents ()
{
local DIRPATH="$1"
local TARARCH="$2.tar.gz"
local ORGIFS="$IFS"
IFS=$'\n'
tar -C "$DIRPATH" -czf "$TARARCH" $( ls -a "$DIRPATH" | grep -v '\(^\.$\)\|\(^\.\.$\)' )
IFS="$ORGIFS"
}
You can run it in this way:
$ tar_dir_contents /path/to/some/dir my_archive
and it will generate the archive my_archive.tar.gz
within current directory. It works with hidden (.*) elements and with elements with spaces in their filename.