Определить действие по расширению файла | bash оболочка - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы определить действие по расширению файла в моем массиве. Например, если массив соответствует * .zip, тогда выполните x. Сценарий не будет находиться в пути к архиву.

archive_path="$HOME/Downloads/"

compressed_files=("`find "$achieve_path" -iname "*.zip" -o -iname "*.rar" -o -iname "*.7z"`")

for files in "${compressed_files[@]}"; do
   echo "$files" ;

done

Обновление 1: это еще один метод, который я попробовал. Возвращает без ошибок, но также без результатов.

shopt -s nocasematch

dir="$HOME/Downloads/all/"

 for file in "$dir*.@(.zip|.rar|.7z)" ; do

   case "$file" in

  *.rar)
    echo "$file this is a rar file"
    ;;
  *.zip)
    echo "$file this is a zip file"
    #...
    ;;
  *.7z)
    echo "$file this is a 7z file"
    #...
    ;;
esac

done

Решение:

Протестированные платформы: macOS Catalina

Примечания: Обновите bash до последней версии, последняя версия macOS не поставляется с последней версией bash по умолчанию.

#!/usr/bin/env bash


shopt -s nocasematch

dir="$HOME/Downloads/all/"

 for file in "$dir"* ; do

   case "$file" in

  *.rar)
    echo "$file this is a rar file"
    ;;
  *.zip)
    echo "$file this is a zip file"
    #...
    ;;
  *.7z)
    echo "$file this is a 7z file"
    #...
    ;;
esac

done

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Если вы не застряли, используя древнюю версию bash, вам вообще не нужно find здесь.

shopt -s globstar extglob nullglob nocasematch

for file in **/*.@(zip|rar|7z); do
     case $file in
       *.zip) ... ;;
       *.rar) ... ;;
       *.7z) ... ;;
     esac
done
0 голосов
/ 07 апреля 2020

См. Как сохранить результаты команды "find" в виде массива в Bash, чтобы узнать, как правильно передать результаты find в массив bash.

Вы можете соответствовать в for l oop, например:

shopt -s nocasematch  # ignore upper/lower case in 'case' statement
for file in "${compressed_files[@]}" ; do
   case "$file" in
   *.zip)
      echo "do something with zip file $file"
      ;;
   *.rar)
      echo "do something else with rar file $file"
      ;;
   *)
      echo "handling file $file"
      ;;
   esac
done
...