Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在使用tar提取文件时使用带通配符的OR运算符_Linux_Shell_Tar - Fatal编程技术网

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

Linux 如何在使用tar提取文件时使用带通配符的OR运算符,linux,shell,tar,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'; don

虽然我可以在一个文件夹中找到所有的.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
如何防止此错误。我相信应该有一种方法可以为多个通配符提供“OR”操作符,就像在其他脚本语言中一样

tar不是一种脚本语言

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

tar ... 2> /dev/null
但请注意,您可能会错过其他错误

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

tar --list -f ...tgz | grep '\.\(pdf\|mobi\|epub\)$'
tar不是一种脚本语言

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

tar ... 2> /dev/null
但请注意,您可能会错过其他错误

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

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;

感谢@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;

这可能更多的是关于或的主题,但我猜通配符将像一个全局模式一样工作,并且可以组合为-no-archored\*.{pdf,mobi,epub}但如果没有出现,它可能仍然会报告一个错误这可能更多的是关于或的主题,但我猜通配符将像一个全局模式一样工作,并且可以组合为-no锚定\*.{pdf,mobi,epub},但如果不存在,它可能仍然会报告错误谢谢您的回复。我正在尝试以下代码,但它正在提取所有文件。在读取i时查找“/home/pi/Downloads/complete/”-键入f-name*.tgz;do tar-kxvzf$i-C/home/pi/Downloads/complete/ebook/|grep'.\pdf\|mobi\|epub\$;done@Ankit:您应该grep-list,而不是extract.Ok。我从所有档案中获得匹配文件的列表,但不知道如何使用它从档案中提取列出的文件。在读取i时查找“/home/pi/Downloads/complete/”-键入f-name*.tgz;do tar-list–f$i|grep\.\pdf\|mobi\|epub\$;done@Ankit:通过管道将列表传输到xargs,以从$i中提取文件。感谢您的回复。我正在尝试以下代码,但它正在提取所有文件。在读取i时查找“/home/pi/Downloads/complete/”-键入f-name*.tgz;do tar-kxvzf$i-C/home/pi/Downloads/complete/ebook/|grep'.\pdf\|mobi\|epub\$;done@Ankit:您应该grep-list,而不是extract.Ok。我从所有档案中获得匹配文件的列表,但不知道如何使用它从档案中提取列出的文件。在读取i时查找“/home/pi/Downloads/complete/”-键入f-name*.tgz;do tar-list–f$i|grep\.\pdf\|mobi\|epub\$;done@Ankit:通过管道将列表传输到xargs,以从$i中提取文件。