Intereting Posts
Передача-пульт: получить идентификатор торрента после добавления торрента Как передать переменную скрипту KSH с CGI? Как напечатать конкретный столбец с awk на удаленном сеансе ssh? Предоставление пользователю доступа к веб-камере Зашифрованный раздел LVM без таблицы разделов Извлечь часть одной строки и отсортировать Как скопировать несколько файлов с одним и тем же именем из каталога детей в другой каталог без потери родительского каталога? Postfix не проверяет адрес «От:» с помощью sender_login_maps Как я могу сделать исполняемую программу всюду Как проверить, какая версия редактора VI у меня есть? Установите обратный вызов, когда возникает определенный процесс Нет информации о версии? Каков синтаксис сложного условия в оболочке? Есть ли команда для переключения в существующее пространство имен? Как работает GNOME Shell Extensions?

разархивируйте два разных типа расширений файлов

Обратите внимание, что .zip и .jar – просто пример, мои расширения файлов разные. Предположим, у меня есть каталог, который может содержать количество zip-файлов

a.zip b.zip c.zip 

И / ИЛИ

 z.jar x.jar y.jar 

наряду с другим содержимым.

Я хочу их распаковать.

Я пытался

 unzip -q *.zip 

а также

 unzip -q *.jar 

Но когда папка не содержит .jar-файлов, вторая команда будет терпеть неудачу

 unzip: cannot find or open *.jar, *.jar.zip or *.jar.ZIP. No zipfiles found. 

Для меня это проблематично, так как это ошибка, с которой мой скрипт выйдет. Я хочу тихо разархивировать * .zip и * .jar без ошибок. Нужно ли это сделать?

Да, вы можете использовать nullglob в bash:

 $ shopt -s nullglob $ tee foo.zip bar.zip </dev/null $ echo *.zip *.jar bar.zip foo.zip 

Опция nullglob изменяет поведение несогласованного glob, чтобы стать литеральной строкой для полного удаления.

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

 shopt -s nullglob zips=( *.zip ) jars=( *.jar ) (( "${#zips[@]}" )) && unzip -q "${zips[@]}" (( "${#jars[@]}" )) && unzip -q "${jars[@]}" 

Или все сразу (если применимо):

 shopt -s nullglob zipsandjars=( *.zip *.jar ) (( "${#zipsandjars[@]}" )) && unzip -q "${zipsandjars[@]}" 

В оболочке POSIX что-то подобное можно также сделать так:

 for file in *.zip *.jar; do if [ "$file" != "*.zip" ] && [ "$file" != "*.jar" ]; then unzip -q "$file" fi done