使用 find 和 tar 查找名称中含有特殊字符的文件

使用 find 和 tar 查找名称中含有特殊字符的文件

我想递归地存档文件夹中的所有 .ctl 文件。

tar -cf ctlfiles.tar `find /home/db -name "*.ctl" -print`

错误信息:

tar: Removing leading `/' from member names
tar: /home/db/dunn/j: Cannot stat: No such file or directory
tar: 74.ctl: Cannot stat: No such file or directory

我有这些文件:/home/db/dunn/j 74.ctl 和 j 75。请注意额外的空格。如果文件有其他特殊字符怎么办?如何递归存档这些文件?

答案1

使用-Ttar 的功能告诉它从另一个文件读取文件列表(tar 将每一行视为一个单独的文件)。

然后,你可以使用<()符号让你的 shell 从命令的输出中生成一个伪文件:

tar cf ctlfiles.tar -T <(find /home/db -name "*.ctl")

如果你的 shell 不支持<()符号,你可以使用临时文件:

find /home/db -name "*.ctl" > ctlfile-list
tar cf ctlfiles.tar -T ctlfile-list
rm ctlfile-list

答案2

当“-T”后面的参数为“-”时,文件列表将从标准输入中获取。tar 的最新版本通常支持“-null”选项,该选项表示“-T”选项指定的源中给出的文件以空字符分隔。

因此,以下内容适用于任意数量的文件,可能包含换行符:

find /home/db -name '*.ctl' -print0 | tar --null -T - -cf ctlfiles.tar

答案3

您可以将 find 的 -print0 功能与 xargs 的 -0 功能一起使用,如下所示:

find /home/db -name '*.ctl' -print0 | xargs -0 tar -cf ctlfiles.tar

-print0(即连字符打印零)告诉 find 使用空值作为路径之间的分隔符而不是空格,而 -0(即连字符零)告诉 xargs 期望相同的结果。

编辑后添加:

如果您有大量文件,xargs 可能会多次调用 tar。请参阅注释以了解处理该问题的方法,或者让 find 直接调用 tar,如下所示,它可以处理任意数量的文件,即使它们的名称中有空格或换行符:

rm -f ctlfiles.tar
find /home/db -name '*.ctl' -exec tar -rf ctlfiles.tar {} +

相关内容