Shell命令过滤掉管道中不存在的文件

Fox*_*Fox 5 backup tar

我正在寻找一种很好的方法来生成备份 tar.gz,该备份 tar.gz 将被另一个 tar.gz 的提取覆盖。

tar -ztf patch.tar.gz | grep -v "/$" | tar -T- -zcvf backup.tar.gz
Run Code Online (Sandbox Code Playgroud)

这工作得很好!但是,有时,新补丁(patch.tar.gz)不仅会包含硬盘中已经存在的文件,而且可能会添加不存在的新文件。这些不存在的文件将无法备份,第二个 tar 将产生错误。退出代码是2

tar:文件夹/文件.txt:无法统计:没有这样的文件或目录
tar:由于先前的错误而以失败状态退出

我正在寻找仅检查文件存在 (stdin) 并在 stdout 上发送现有文件的 shell 命令。它存在吗?我需要这样的东西:

tar -ztf patch.tar.gz | grep -v "/$" | filterfileexist | tar -T- -zcvf backup.tar.gz
Run Code Online (Sandbox Code Playgroud)

我需要一个 shell 命令而不是一个 shell 脚本。
显然,我可以自己在 C 中实现这个 shell 命令,因为它非常简单,但我希望找到一些可以在其他 UNIX 平台上找到的通用内容。

Nik*_*Nik 7

尝试使用 perl oneliner 来实现此目的

喜欢

cat filelist | perl -ne 'chomp(); if (-e $_) {print "$_\n"}' | tar -T- -zcvf backup.tar.gz
Run Code Online (Sandbox Code Playgroud)