2016-09-04 12 views
0

Хотя я могу найти все .tgz-файлы в папке, а затем извлечь из него только файлы PDF, EPUB и MOBI, если они есть в архиве.Как использовать оператор OR с подстановочными знаками при извлечении файлов с помощью tar

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, доступным на других языках сценариев.

+0

Это, вероятно, больше на тему в http://unix.stackexchange.com или http://superuser.com, но я бы предположил, что подстановочные будет работать как шаблон Glob, и могут быть объединены в '--no-anchored \ *. {pdf, mobi, epub}' (но если он отсутствует, он все равно может сообщить об ошибке) –

ответ

3

tar не является языком сценариев.

Чтобы скрыть сообщение об ошибке, просто перенаправить поток ошибок дегтя в битоприемник:

tar ... 2> /dev/null 

Обратите внимание, что вы можете пропустить другие ошибки, хотя.

Безопасный способ состоит в том, чтобы сначала отобразить файлы, выбрать те, которые нужно извлечь, и делать это только в том случае, если они есть.

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

Спасибо за ваш ответ. Я пытаюсь использовать следующий код, но он извлекает все файлы. 'find '/ home/pi/Downloads/complete /' -type f -name" * .tgz "| при чтении i; do tar -kxvzf "$ i" -C/home/pi/Downloads/complete/ebook/| grep '\. \ (pdf \ | mobi \ | epub \) $'; done' –

+0

@Ankit: вы должны grep '--list', а не экстракт. – choroba

+0

Хорошо. Я получаю список совпадающих файлов со всех архивов, но не имею понятия, как использовать его для извлечения перечисленных файлов из архива. 'find '/ home/pi/Downloads/complete /' -type f -name" * .tgz "| при чтении i; do tar --list -f "$ i" | grep '\. \ (pdf \ | mobi \ | epub \) $'; done' –

0

Благодаря @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;