Как проверить расширение имени файла в 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