如何在使用 tar 提取文件时使用带通配符的 OR 运算符

How to use OR operator with wildcards while extracting files with tar

虽然我可以找到一个文件夹中的所有 .tgz 文件,然后仅从中提取 PDF、EPUB 和 MOBI 文件(如果它存在于存档中)。

find '/home/pi/Downloads/complete/' -type f -name "*.tgz"| while read i ; do tar -xvzf "$i" -C /home/pi/Downloads/complete/ebook/ --strip=1 --wildcards --no-anchored '*.pdf' '*.mobi' '*.epub'; done

当存档中存在 pdf、mobi 或 epub 时,这行代码可以完美运行。但是,使用此代码,每当给定存档中没有 pdf / epub / mobi 时,它 returns 就会出现如下所示的错误。

tar: *.pdf: Not found in archive
tar: *.mobi: Not found in archive
tar: Exiting with failure status due to previous errors

如何防止这个错误。我相信应该有一种方法可以为多个通配符提供一个 'OR' 运算符,就像在其他脚本语言中一样。

tar 不是脚本语言。

要隐藏错误消息,只需将 tar 的 stderr 重定向到一个位桶:

tar ... 2> /dev/null

请注意,您可能会错过其他错误。

安全的方法是先列出文件,select 要提取的文件,只有在有文件时才这样做。

tar --list -f ...tgz | grep '\.\(pdf\|mobi\|epub\)$'

感谢@choroba,下面的代码是完美的。没有错误报告。将代码作为答案发布,以便其他人可以更好地了解最终的工作代码。

find '/home/pi/Downloads/complete/' -type f -name "*.tgz"| while read i ; do tar --list -f "$i" | grep '\.\(pdf\|mobi\|epub\)$' | while read -r line ; do  tar -kxvzf "$i" -C "/home/pi/Downloads/complete/ebook/" "$line" --strip=1;done; done;