Как проверить расширение имени файла в bash script?

Я пишу ночную сборку script в bash.
Все нормально и денди, за исключением одной маленькой хватки:


#!/bin/bash

for file in "$PATH_TO_SOMEWHERE"; do
      if [ -d $file ]
      then
              # do something directory-ish
      else
              if [ "$file" == "*.txt" ]       #  this is the snag
              then
                     # do something txt-ish
              fi
      fi
done;

Моя проблема заключается в определении расширения файла и последующем действии. Я знаю, что проблема заключается в if-statement, тестировании для txt файла.

Как определить, имеет ли файл суффикс .txt?

Ответ 1

Я думаю, вы хотите сказать: "Являются ли последние четыре символа $файла равными .txt?" Если это так, вы можете использовать следующее:

if [ ${file: -4} == ".txt" ]

Обратите внимание, что требуется пробел между file: и -4, так как модификатор ': -' означает что-то другое.

Ответ 2

Сделайте

if [ "$file" == "*.txt" ]

вот так:

if [[ $file == *.txt ]]

То есть, двойные скобки и кавычки.

Правая сторона == - это шаблон оболочки. Если вам нужно регулярное выражение, используйте =~ then.

Ответ 3

Вы просто не можете быть уверены в системе Unix, что файл .txt действительно является текстовым файлом. Лучше всего использовать "файл". Возможно, попробуйте использовать:

file -ib "$file"

Затем вы можете использовать список типов MIME для сопоставления или анализа первой части MIME, где вы получаете такие вещи, как "текст", "приложение" и т.д.

Ответ 4

Вы можете использовать команду "файл", если вы действительно хотите узнать информацию о файле, а не полагаться на расширения.

Если вам удобно пользоваться расширением, вы можете использовать grep, чтобы увидеть, совпадает ли он.

Ответ 5

Вы также можете сделать:

   if [ "${FILE##*.}" = "txt" ]; then
       # operation for txt files here
   fi

Ответ 6

Подобно "файлу", используйте немного более простой "mimetype -b", который будет работать независимо от расширения файла.

if [ $(mimetype -b "$MyFile") == "text/plain" ]
then
  echo "this is a text file"
fi

Изменить: вам может потребоваться установить libfile-mimeinfo-perl в вашей системе, если mimetype недоступен

Ответ 7

Я написал bash script, который смотрит на тип файла, затем копирует его в место, я использую его для просмотра видео, которое я просматривал в Интернете из моего кеша firefox:

#!/bin/bash
# flvcache script

CACHE=~/.mozilla/firefox/xxxxxxxx.default/Cache
OUTPUTDIR=~/Videos/flvs
MINFILESIZE=2M

for f in `find $CACHE -size +$MINFILESIZE`
do
    a=$(file $f | cut -f2 -d ' ')
    o=$(basename $f)
    if [ "$a" = "Macromedia" ]
        then
            cp "$f" "$OUTPUTDIR/$o"
    fi
done

nautilus  "$OUTPUTDIR"&

Он использует похожие идеи для тех, которые представлены здесь, надеюсь, что это кому-то поможет.

Ответ 8

Правильный ответ о том, как получить расширение, доступное для имени файла в linux:

${filename##*\.} 

Пример печати всех расширений файлов в каталоге

for fname in $(find . -maxdepth 1 -type f) # only regular file in the current dir
    do  echo ${fname##*\.} #print extensions 
done

Ответ 9

Я думаю, что '$PATH_TO_SOMEWHERE' это что-то вроде '<directory>/*'.

В этом случае я бы изменил код на:

find <directory> -maxdepth 1 -type d -exec ... \;
find <directory> -maxdepth 1 -type f -name "*.txt" -exec ... \;

Если вы хотите сделать что-то более сложное с именами каталогов и текстовых файлов, вы можете:

find <directory> -maxdepth 1 -type d | while read dir; do echo $dir; ...; done
find <directory> -maxdepth 1 -type f -name "*.txt" | while read txtfile; do echo $txtfile; ...; done

Если в именах файлов есть пробелы, вы можете:

find <directory> -maxdepth 1 -type d | xargs ...
find <directory> -maxdepth 1 -type f -name "*.txt" | xargs ...

Ответ 10

Я возьму его с вырезом

>cut -d'.' -f2<<<"hi_mom.txt"
txt

Мой захват с помощью awk будет примерно следующим.

>MY_DATA_FILE="my_file.sql"
>FILE_EXT=$(awk -F'.' '{print $NF}' <<< $MY_DATA_FILE)
>if [ "sql" = "$FILE_EXT" ]
>then
>   echo "file is sql"
>fi

>awk -F'.' '{print $NF}' <<eof
>hi_mom.txt
>my_file.jpg
>eof