Shell 创建tar并将其保存到stdout

Shell 创建tar并将其保存到stdout,shell,sh,Shell,Sh,我试图从一个包含其他文件列表的文件创建tar,并将其保存到stdout 假设有一个名为“要创建的文件”的文件,它有其他文件的路径,如/home/abc.txt/home/def.txt,我想创建abc.txt的tar,def.txt 我的脚本包含: exec 100>&1 tar cf - -T files-to-sync >&100 我调用脚本并将其保存到其他文件,如: /script.sh>最终tar.tar 但是,在创建tar时,我遇到了错误,有人能帮我解决吗

我试图从一个包含其他文件列表的文件创建tar,并将其保存到stdout

假设有一个名为“要创建的文件”的文件,它有其他文件的路径,如/home/abc.txt/home/def.txt,我想创建abc.txt的tar,def.txt

我的脚本包含:

exec 100>&1
tar cf - -T files-to-sync >&100
我调用脚本并将其保存到其他文件,如:

/script.sh>最终tar.tar


但是,在创建tar时,我遇到了错误,有人能帮我解决吗?

您可以使用以下脚本来实现您的目标,如果有不清楚的地方,请告诉我:

原型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 $?
$ tree .
.
├── a
│   └── abc.txt
├── b
│   └── def.txt
├── c
│   └── ghj.txt
├── files-to-sync.in
└── scriptTar.sh

3 directories, 5 files
$ cat files-to-sync.in 
./a/abc.txt
./b/def.txt
./c/ghj.txt
$ ./scriptTar.sh files-to-sync.in output.tar
$ 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
#!/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 
tar xvf output.tar 
./a/abc.txt
./b/def.txt
./c/ghj.txt
more ?/*.txt
::::::::::::::
a/abc.txt
::::::::::::::
abc
::::::::::::::
b/def.txt
::::::::::::::
abc
::::::::::::::
c/ghj.txt
::::::
列出文件内容:

$ 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 $?
$ tree .
.
├── a
│   └── abc.txt
├── b
│   └── def.txt
├── c
│   └── ghj.txt
├── files-to-sync.in
└── scriptTar.sh

3 directories, 5 files
$ cat files-to-sync.in 
./a/abc.txt
./b/def.txt
./c/ghj.txt
$ ./scriptTar.sh files-to-sync.in output.tar
$ 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
#!/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 
tar xvf output.tar 
./a/abc.txt
./b/def.txt
./c/ghj.txt
more ?/*.txt
::::::::::::::
a/abc.txt
::::::::::::::
abc
::::::::::::::
b/def.txt
::::::::::::::
abc
::::::::::::::
c/ghj.txt
::::::
执行:

$ 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 $?
$ tree .
.
├── a
│   └── abc.txt
├── b
│   └── def.txt
├── c
│   └── ghj.txt
├── files-to-sync.in
└── scriptTar.sh

3 directories, 5 files
$ cat files-to-sync.in 
./a/abc.txt
./b/def.txt
./c/ghj.txt
$ ./scriptTar.sh files-to-sync.in output.tar
$ 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
#!/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 
tar xvf output.tar 
./a/abc.txt
./b/def.txt
./c/ghj.txt
more ?/*.txt
::::::::::::::
a/abc.txt
::::::::::::::
abc
::::::::::::::
b/def.txt
::::::::::::::
abc
::::::::::::::
c/ghj.txt
::::::
tar文件内容:

$ 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 $?
$ tree .
.
├── a
│   └── abc.txt
├── b
│   └── def.txt
├── c
│   └── ghj.txt
├── files-to-sync.in
└── scriptTar.sh

3 directories, 5 files
$ cat files-to-sync.in 
./a/abc.txt
./b/def.txt
./c/ghj.txt
$ ./scriptTar.sh files-to-sync.in output.tar
$ 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
#!/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 
tar xvf output.tar 
./a/abc.txt
./b/def.txt
./c/ghj.txt
more ?/*.txt
::::::::::::::
a/abc.txt
::::::::::::::
abc
::::::::::::::
b/def.txt
::::::::::::::
abc
::::::::::::::
c/ghj.txt
::::::
如果确实要在标准输出上显示,请使用以下脚本:

原型2通过ssh:

$ 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 $?
$ tree .
.
├── a
│   └── abc.txt
├── b
│   └── def.txt
├── c
│   └── ghj.txt
├── files-to-sync.in
└── scriptTar.sh

3 directories, 5 files
$ cat files-to-sync.in 
./a/abc.txt
./b/def.txt
./c/ghj.txt
$ ./scriptTar.sh files-to-sync.in output.tar
$ 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
#!/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 
tar xvf output.tar 
./a/abc.txt
./b/def.txt
./c/ghj.txt
more ?/*.txt
::::::::::::::
a/abc.txt
::::::::::::::
abc
::::::::::::::
b/def.txt
::::::::::::::
abc
::::::::::::::
c/ghj.txt
::::::
提取内容:

$ 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 $?
$ tree .
.
├── a
│   └── abc.txt
├── b
│   └── def.txt
├── c
│   └── ghj.txt
├── files-to-sync.in
└── scriptTar.sh

3 directories, 5 files
$ cat files-to-sync.in 
./a/abc.txt
./b/def.txt
./c/ghj.txt
$ ./scriptTar.sh files-to-sync.in output.tar
$ 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
#!/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 
tar xvf output.tar 
./a/abc.txt
./b/def.txt
./c/ghj.txt
more ?/*.txt
::::::::::::::
a/abc.txt
::::::::::::::
abc
::::::::::::::
b/def.txt
::::::::::::::
abc
::::::::::::::
c/ghj.txt
::::::
检查文件:

$ 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 $?
$ tree .
.
├── a
│   └── abc.txt
├── b
│   └── def.txt
├── c
│   └── ghj.txt
├── files-to-sync.in
└── scriptTar.sh

3 directories, 5 files
$ cat files-to-sync.in 
./a/abc.txt
./b/def.txt
./c/ghj.txt
$ ./scriptTar.sh files-to-sync.in output.tar
$ 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
#!/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 
tar xvf output.tar 
./a/abc.txt
./b/def.txt
./c/ghj.txt
more ?/*.txt
::::::::::::::
a/abc.txt
::::::::::::::
abc
::::::::::::::
b/def.txt
::::::::::::::
abc
::::::::::::::
c/ghj.txt
::::::

但是,如果我是你,我不仅会生成一个tar文件,还会添加一些压缩(
tar.gz
)并使用
rsync
传输文件,以便能够在传输错误时从停止点重新启动下载。

因此正确的解决方案是

案例1:如果您将文件列表作为参数传递

您可以使用以下选项:

files-to-sync=$1
tar cf - -T files-to-sync
tar cfP - -T /path/to/the/file
案例2:如果要使用文件列表的绝对路径

您可以使用以下选项:

files-to-sync=$1
tar cf - -T files-to-sync
tar cfP - -T /path/to/the/file

如果是绝对路径,请使用-p。

您的确切错误是什么?实际上我正在从其他服务器调用脚本。因此,情况是server1有这个脚本,我从server2使用ssh调用server1的脚本。从server2我正在执行
ssh server1”/运行\u script.sh“>最终的\u tar.tar
为什么不使用
scp
将tar文件从一台服务器传输到另一台服务器?创建tar文件后,它是一个巨大的tarball,因此scp会使事情变得缓慢。我们不能像我在问题语句中尝试那样做吗在终端中使用此命令时,我得到以下信息:
tar cf--t要同步的文件
Error:
tar:拒绝将存档内容写入终端(缺少-f选项?)tar:错误不可恢复:现在退出
我已经编辑了我的帖子以考虑ssh连接,试试看!它对我很管用;-)