使用 Find 返回引用文件路径列表

使用 Find 返回引用文件路径列表

我想创建一个 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 - --nulltar来接收以空字符结尾的文件名stdin

答案2

以空字符结尾的输出通过管道传输至tar由 geekosaur 推荐应该可以解决问题,但您也可以使用-execfind 选项来实现。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 手册页的引用部分以了解更多信息。

相关内容