

If there was unexpected output as errors in file read from find, tar would not know or care what's going on.īut with further checks, like processing error stream from find, it might be a good solution where many options and filters on files are required. It also sends all directory names, which tar with -no-recursion ignores or adds as empty ones followed by all files in each directory. If you leave the job to find, every filepath name, goes through the pipe. The same result might be achieved using solution described by difference with the solution here is in that which tool is doing the recursing. That FILE from above is the standard input, from the pipe Printf does not add a newline at the end of the string. %P File's name with the name of the starting-point under which it was found removed.
LINUX UNTAR TO A SPECIFIC DIRECTORY ARCHIVE
Using above command creates an archive tar file which can be further processed or delivered to someone without looking weird or needing an explanation or a tool to unpack. It seems that another tool, like find or ls ( ls -A -1) is needed to accomplish these goals and tar using just its arguments is unable to pick files and create an archive with such requirements. There are no weird looking './' in front of files and dirs. Packed files and dirs are in the root of the archive without path info and deeper files have relative path. This might not work where your shell globs * in the current directory, so alternatively, use: shopt -s dotglobįind my_directory/ -maxdepth 1 -printf "%P\n" | tar -cvf my_archive.tar -C my_directory/ -T. Though now we are messing with shell options, we might decide that it is neater to have * match hidden files: shopt -s dotglob If the error is a problem (you are checking for success in a script), this works: shopt -s nullglob Now tar will return an error if there are no files matching. This is a trick I learnt from this answer. One solution is to use some Bash globs to list all files except for. I found that this caused problems when using this method to manipulate tarballs used as package files in BuildRoot. Notice however how the filenames are stored in the tar file as, for example.

This Answer should work in most situations. However, if you don't have GNU find, this works to make the paths relative (removes parents with sed): find /my/dir/ -type f -o -type l -o -type d | sed s,^/my/dir/, | tar -czf mydir.tgz -no-recursion -C /my/dir/ -T. The command uses printf (available in GNU find) which tells find to print its results with relative paths.
LINUX UNTAR TO A SPECIFIC DIRECTORY PDF
If you need to do something special with filenames (filtering, following symlinks etc), the find command is pretty powerful, and you can test it by just removing the tar part of the above command: $ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type dįor example if you want to filter PDF files, add ! -name '*.pdf' $ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d The -no-recursion flag is so that tar doesn't recurse into folders it is told to archive (causing duplicate files). The -C option is needed so tar knows where the files with relative names are located. The best way is to combine it with tar's -T option, like this: find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz -no-recursion -C /my/dir/ -T -īasically what it does is list all files ( -type f), links ( -type l) and subdirectories ( -type d) under your directory, make all filenames relative using -printf "%P\n", and then pass that to the tar command (it takes filenames from STDIN using -T -).

) to add a file list to the command (like in magnus' answer), but that potentially causes a "file list too long" error.

It becomes increasingly difficult to tame the command. You can move all the files out of that directory by using the -transform configuration option, but that doesn't get rid of the. in the archive: tar -czf mydir.tgz -C /my/dir. The below unfortunately includes a parent directory. With some conditions (archive only files, dirs and symlinks): find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz -no-recursion -C /my/dir/ -T. file1!) find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz -no-recursion -C /my/dir/ -T.
