tenstormavi
tenstormavi

Reputation: 335

create tar and save it to stdout

I am trying to create tar from a file, which contains list of other files and saving it to stdout.

let suppose there is a file called "files-to-create" which has path of other files like /home/abc.txt /home/def.txt and I want to create tar of abc.txt,def.txt.

my script contains:

exec 100>&1
tar cf - -T files-to-sync >&100

and I am calling the script and saving it to some other file like:

/script.sh > final_tar.tar

But while creating the tar I am getting error, can somebody help me out?

Upvotes: 5

Views: 11773

Answers (2)

tenstormavi
tenstormavi

Reputation: 335

So the proper solution is

Case1: If you are passing the list of file as an argument

you can use this:

files-to-sync=$1
tar cf - -T files-to-sync

Case2: If you want to use absolute path for the list of file

you can use this:

tar cfP - -T /path/to/the/file

use -P in case of absolute path.

Upvotes: 1

Allan
Allan

Reputation: 12438

You can use the following script to reach your goal, let me know if something is unclear:

Prototype 1:

$ cat scriptTar.sh 
#!/bin/bash

readonly HELP="$(basename "$0") <list_of_files> <output_tar>

this script will generate a tar file composed of all files present in <list_of_files> input file
the output tar file will be saved as <output_tar>
to run the script provide the input and output filenames"

readonly INPUT_LIST_FILE=$1
readonly OUTPUT_TAR_FILE=$2
if [ -z "$INPUT_LIST_FILE" -o -z "$OUTPUT_TAR_FILE" ]
then
 echo $HELP; 
 exit 1;
fi

tar cf - -T $INPUT_LIST_FILE > $OUTPUT_TAR_FILE 
exit $?

Folder content:

$ tree .
.
├── a
│   └── abc.txt
├── b
│   └── def.txt
├── c
│   └── ghj.txt
├── files-to-sync.in
└── scriptTar.sh

3 directories, 5 files

List file content:

$ cat files-to-sync.in 
./a/abc.txt
./b/def.txt
./c/ghj.txt

Execution:

$ ./scriptTar.sh files-to-sync.in output.tar

tar file content:

$ tar -tvf output.tar                                                                                                                          
-rw-rw-r-- arobert/arobert   4 2018-02-22 16:50 ./a/abc.txt
-rw-rw-r-- arobert/arobert   4 2018-02-22 16:50 ./b/def.txt
-rw-rw-r-- arobert/arobert   4 2018-02-22 16:50 ./c/ghj.txt

Or use the following script if you really want to display it on stdout:

Prototype 2 via ssh:

#!/bin/bash

readonly HELP="ERROR: $(basename "$0") <list_of_files> 

this script will generate to stdout a tar file composed of all files present in <list_of_files> input file
to run the script provide the input file and redirect the output to a file"

readonly INPUT_LIST_FILE=$1
if [ -z "$INPUT_LIST_FILE" ]
then
 echo $HELP; 
 exit 1;
fi

tar cf - -T $INPUT_LIST_FILE 

Execution via ssh: $ ssh user@localhost "cd /home/user/test_tar/; ./scriptTar.sh files-to-sync.in" > output.tar user@localhost's password:

Content of the tar generated:

tar -tf output.tar
./a/abc.txt
./b/def.txt
./c/ghj.txt

extracting the content:

tar xvf output.tar 
./a/abc.txt
./b/def.txt
./c/ghj.txt

checking the files:

more ?/*.txt
::::::::::::::
a/abc.txt
::::::::::::::
abc
::::::::::::::
b/def.txt
::::::::::::::
abc
::::::::::::::
c/ghj.txt
::::::

However if I were you, I would not only generate a tar file but add some compression (tar.gz) and transfer the file with rsync to be able to restart the download from the point where it stopped in case of transfer error.

Upvotes: 1

Related Questions