Я пишу ночной сценарий сборки в 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-файл.
Как определить, имеет ли файл суффикс .txt?
$(dirname $PATH_TO_SOMEWHERE)
и$(basename $PATH_TO_SOMEWHERE)
для разделения на папки и директории и делать что-то с каталогами и файламиОтветы:
Я думаю, что вы хотите сказать: «Последние четыре символа $ file равны
.txt
?» Если это так, вы можете использовать следующее:Обратите внимание, что между
file:
и-4
требуется пробел , так как модификатор ': -' означает что-то другое.источник
${var:-4}
это не то же самое, что${var: -4}
; первый (без пробела) будет расширяться как '-4', если переменная не установлена, вторая (с пробелом) возвращает последние 4 символа переменной var.if [ "${file: -4}" == ".txt" ]
вместо.Делать
как это:
То есть в двойных скобках и без кавычек.
Правая сторона
==
- это шаблон оболочки. Если вам нужно регулярное выражение, используйте=~
тогда.источник
if
выражении. Я делюсь этим здесь на случай, если это кому-то поможет.if [[ ( $file == *.csv ) || ( $file == *.png ) ]]
if [[ $file =~ .*\.(csv|png) ]]
. Он короче, понятнее, проще добавлять дополнительные расширения и его можно легко настроить (поместив «csv | png» в переменную).if [[ "$file" == *.txt ]]
Если в имени файла есть пробелы, двойные кавычки обязательны.Вы просто не можете быть уверены в системе Unix, что файл .txt действительно является текстовым файлом. Лучше всего использовать файл. Может быть, попробуйте использовать:
Затем вы можете использовать список типов MIME для сопоставления или анализа первой части MIME, где вы получаете такие вещи, как «текст», «приложение» и т. Д.
источник
file -i...
числе кодирование MIME, вы можете использоватьfile --mime-type -b ...
Вы можете использовать команду «file», если вы действительно хотите узнать информацию о файле, а не полагаться на расширения.
Если вы чувствуете себя комфортно при использовании расширения, вы можете использовать grep, чтобы увидеть, соответствует ли оно.
источник
file
команды. Я на самом деле пытался сопоставить, основываясь на выводе указанной команды ... но я ужасно провалился в этих операторах if.Вы также можете сделать:
источник
case $FILE in *.txt ) ... ;; esac
казалось бы более надежным и идиоматическим.Подобно «file», используйте чуть более простой «mimetype -b», который будет работать независимо от расширения файла.
Редактировать: вам может понадобиться установить libfile-mimeinfo-perl в вашей системе, если mimetype недоступен
источник
Правильный ответ о том, как получить расширение, доступное в имени файла в linux:
Пример печати всех расширений файлов в каталоге
источник
Я написал bash-скрипт, который просматривает тип файла, затем копирует его в папку, и я использую его для просмотра видео, которые я смотрел онлайн, из моего кеша Firefox:
Он использует идеи, аналогичные представленным здесь, надеюсь, это кому-нибудь пригодится.
источник
Я думаю,
'$PATH_TO_SOMEWHERE'
это что-то вроде'<directory>/*'
.В этом случае я бы изменил код на:
Если вы хотите сделать что-то более сложное с именами каталогов и текстовых файлов, вы можете:
Если в именах файлов есть пробелы, вы можете:
источник
for
иwhile
циклы лучше зарезервировать для случаев, когда тело цикла должно быть более сложным.