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

标签 linux shell 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 时,它都会返回错误,如下所示。

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

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

最佳答案

tar 不是脚本语言。

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

tar ... 2> /dev/null

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

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

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

关于linux - 如何在使用 tar 提取文件时使用带通配符的 OR 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39316778/

相关文章:

linux - Bash 脚本不返回任何输出

linux - 在不使用 "mv"(shell 脚本)的情况下,将当前目录中的新 TAR 文件创建到新目录

Python tar生成问题

c++ - 在 Linux 中使用 C/C++ 获取机器序列号和 CPU ID

linux - 使用Bash脚本在X时间内创建短和长的sqlplus连接

c++ - 寻找fat32源

python - 如何使用 Python 在 Linux 服务器中自动创建用户

ubuntu - 如何为 tar 命令选择目标目录

android - 从 Android 手机发送命令到 Linux 桌面

linux - 我怎样才能用 yas3fs 做一份 Upstart 的工作?