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



Я пишу ночной скрипт сборки в 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-заявлении, тестировании для txt-файла.



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

1570   10  

10 ответов:

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

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

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

сделать

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

такой:

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

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

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

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

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

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

file -ib "$file"

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

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

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

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

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

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

Я написал сценарий bash, который смотрит на тип файла, а затем копирует его в местоположение, я использую его для просмотра видео, которые я смотрел онлайн из своего кэша 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"&

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

думаю, что '$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 ...

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

${strFileName##*\.} 

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

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

мой взгляд на него со срезанными

>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

Comments

    Ничего не найдено.