regexp в ksh для расширений tgz, tar.tgz

Я пытаюсь получить regexp (в ksh) для идентификации файлов только с такими расширениями: tgz , tar.gz , TGZ и TAR.GZ Я попробовал несколько, но не могу заставить их работать. Я использую это регулярное выражение для выбора только файлов с этими расширениями, чтобы выполнить некоторую работу с ними:

 if [ -f $myregexp ]; then ..... fi 

3 Solutions collect form web for “regexp в ksh для расширений tgz, tar.tgz”

[ -f "$myregexp" ] или [[ -f $myregexp ]] если есть файл с именем точно $myregexp . (Обратите внимание, что с одиночными скобками вам нужны двойные кавычки.)

Если вы хотите проверить наличие файлов, соответствующих шаблону glob, нет прямого пути. Вы должны сделать это в два этапа: сначала сгенерируйте список совпадений, затем проверьте, пуст ли этот список.

 a=( ~(Ni)*.@(tgz|tar.gz) ) if [[ ${#a} -ne 0 ]]; then … 

Это использует ряд специфических для ksh функций:

  • префикс ~(N) для создания пустого списка, если нет совпадения;
  • префикс ~(i) для нечувствительности к регистру;
  • синтаксис glob @(foo|bar) для соответствия foo или bar

Вот эквивалент bash. В bash вы получаете пустое расширение для несовпадающих глобусов и нечувствительность к регистру из опций; extglob – для синтаксиса @(foo|bar) и других расширений ksh glob.

 shopt -s nocaseglob nullglob extglob a=( *.@(tgz|tar.gz) ) if [[ ${#a} -ne 0 ]]; then … 

Вот эквивалент zsh. Опция extended_glob необходима для префикса (#i) для нечувствительного к регистру совпадения. Квалификатор glob (N) указывает на пустое расширение для несовпадающих глобусов.

 setopt extended_glob a=( (#i)*.(tgz|tar.gz)(N) ) if [[ ${#a} -ne 0 ]]; then … 

Вы, например, не знаете, что такое источник, который вы сравниваете. Если вы хотите перечислить файлы в текущем каталоге, вы можете просто объединить несколько глобусов следующим образом:

 for file in *.tgz *.tar.gz *.TGZ *.TAR.GZ; do echo $file done 

Если вы хотите протестировать имя файла в строке против partern, попробуйте следующее:

 if [[ ( $file =~ .*\.(tgz|TGZ|tar\.gz|TAR\.GZ) ) ]]; then echo $file fi 

Или вы можете использовать аргумент case:

 case $file in *.tgz|*.tar.gz|*.TGZ|*.TAR.GZ) echo $file ;; esac 

Вы даже можете сделать нечувствительность к регистру с помощью простых выражений глобуса:

 for f in *.[Tt][Gg][Zz] *.[Tt][Aa][Rr].[Gg][Zz]; do echo $f done 
  • Ошибка синтаксиса вблизи неожиданного токена, выполняемого при циклизации строки с несколькими операторами
  • получить mysql число id в сценарии оболочки
  • Как распечатать только имя скрипта?
  • Команда, чтобы получить счет списка заблокированных пользователей, разблокирован, истек
  • Как искать и заменять текст во всех php-файлах в каталоге и в его подкаталогах
  • Как сделать bash встроенным «read» игнорировать прокомментированные или пустые строки?
  • Как преобразовать несколько изображений tiff в координаты xyz в одном текстовом файле с помощью терминала?
  • apt-get скрипт для обновления обновления dist-upgrade clean и autoremove
  • Редактируйте файл с помощью скрипта, но сохраняйте теги osx
  • sh test два условия получают '
  • Текстовый интерфейс пользователя
  • Linux и Unix - лучшая ОС в мире.