我有一个文件列表 - 由 find 命令产生,如何使用它来压缩/tar 文件并删除原始文件

我有一个文件列表 - 由 find 命令产生,如何使用它来压缩/tar 文件并删除原始文件

我有一个来自命令的文件列表find。如何压缩/tar 文件并删除原始文件?结果来自:find . -type f -exec egrep "mxprod|nlsoprdc" {} /dev/null \;;如何压缩文件并删除原始文件?

答案1

使用 GNU 工具,您可以:

find . -type f -exec grep --null -El 'mxprod|nlsoprdc' {} + |
  tar --xz -cf /path/to/file.tar.xz --remove-files --null -T -

尽管对于 的特定用法find,您可以放弃它并使用 GNUgrep-r

grep -r --null -El 'mxprod|nlsoprdc' . |
  tar --xz -cf /path/to/file.tar.xz --remove-files --null -T -

请注意,找到的文件所在的目录不会添加为存档的成员。它们将在提取存档时重新创建,但不会使用原始元数据(所有权、权限、ACL、其他属性...)。

您可以通过执行以下操作来解决该问题:

grep -r --null -El 'mxprod|nlsoprdc' . |
  awk -F/ -v RS='\0' -v ORS='\0' '{
    p=""; sep=""
    for (i = 1; i < NF; i++) {
      p = p sep $i; sep=FS
      if (! (p in dirs)) {
        print p
        dirs[p]
      }
    }
    print}' |
  tar --xz -cf /path/to/file.tar.xz --no-recursion --remove-files --null -T -

尽管您会看到有关无法删除的目录的错误,tar因为它们不为空。

无论如何,请注意,这很危险,因为如果文件系统已满,则在删除给xz定文件后可能无法写入该文件的输出。tar

最好仅在确保已正确创建存档后才开始删除文件。

相关内容