我想创build一个包含ctime小于30天的目录中的文件的tarball。 我发现的大多数教程基本上都是这样做的:
tar cvf foo.tar $(find ~/POD -type f -ctime -30)
问题是我想要tar的很多文件都包含空格。 这意味着tar命令将根据空格分隔,这意味着完整的文件path将被分解。
所以现在我试图让find命令返回一个引用文件path的列表。 所以这就是我所尝试的:
find . -type f -ctime -30 | xargs printf "\"%s\"\n"
但是这个命令也打破了所有基于空格的文件名。 那么我试过这个:
oldifs=$IFS IFS=\n find . -type f -ctime -30 | xargs printf "\"%s\"\n" IFS=$oldifs
但是,这给了我相同的结果。
有没有一种方法可以将完整的path名传给tar并使其名称中的空格都能工作?
GNU tar有一个-T选项来从指定的文件中获取文件列表。 我会用find ... -print0 | tar cfzT outfile.tgz - --null find ... -print0 | tar cfzT outfile.tgz - --null所以tar接受空find ... -print0 | tar cfzT outfile.tgz - --null文件名在stdin 。
由geekosaurbuild议的通过pipe道连接到tar的空终止输出应该做到这一点,但是你也可以使用find的-exec选项来做到这一点。 发现知道这是一个棘手的问题,所以他们解决了这个问题,你只能从你第一次尝试用tar … $(find …)做的事情来回头tar … $(find …)并使用find来调用tar而不是像这样:
find . -type f -ctime -30 -exec tar cfz outfile.tgz {} +
你几乎已经拥有了。 您需要像$'\ n'那样转义一个新行来指定一个variables。
oifs=$IFS; IFS=$'\n'; tar cvf foo.tar $(find ~/POD -type f -ctime -30); IFS=$oifs
请参阅bash手册页的引用部分以获取更多信息。