我想创建一个 tarball,其中包含来自具有时间少于 30 天。我发现的大多数教程基本上都建议这样做:
tar cvf foo.tar $(find ~/POD -type f -ctime -30)
问题是,我想要打包的许多文件的名称中都包含空格。这意味着该tar
命令将根据空格进行分隔,这意味着完整的文件路径将被拆分。
因此,现在我尝试让find
命令返回带引号的文件路径列表。以下是我尝试过的方法:
find . -type f -ctime -30 | xargs printf "\"%s\"\n"
但是这个命令也会根据空格拆分所有文件名。因此我尝试了这个:
oldifs=$IFS
IFS=\n
find . -type f -ctime -30 | xargs printf "\"%s\"\n"
IFS=$oldifs
但这给了我相同的结果。
有什么方法可以传递完整路径名tar
,并让所有内容在其名称中包含空格的情况下工作?
答案1
GNUtar
有一个-T
选项可以从指定文件中获取文件列表。我会使用find ... -print0 | tar cfzT outfile.tgz - --null
它tar
来接收以空字符结尾的文件名stdin
。
答案2
以空字符结尾的输出通过管道传输至tar
由 geekosaur 推荐应该可以解决问题,但您也可以使用-exec
find 选项来实现。Find 知道这是一个难题,所以他们解决了它,您只需将事情反转过来,而不是您最初尝试使用的方法,tar … $(find …)
而是使用 来find
调用tar
,如下所示:
find . -type f -ctime -30 -exec tar cfz outfile.tgz {} +
答案3
您几乎已经搞定了。您需要转义 \n (例如 $'\n')才能将新行分配给变量。
oifs=$IFS; IFS=$'\n'; tar cvf foo.tar $(find ~/POD -type f -ctime -30); IFS=$oifs
请参阅 bash 手册页的引用部分以了解更多信息。