Как проверить расширение имени файла в 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-файла.
Как я могу определить, если файл имеет .тхт суффикс?
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, где вы получаете такие вещи, как "текст", "приложение" и т. д.
подобно "файлу", используйте немного более простой "mimetype-b", который будет работать независимо от расширения файла.
if [ $(mimetype -b "$MyFile") == "text/plain" ] then echo "this is a text file" fiEdit: возможно, Вам потребуется установить 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