使用shell脚本检查文件是否为jpeg格式

时间:2016-01-20 03:31:39

标签: linux bash shell unix sh

我知道我可以使用#include <sys/time.h> #include <signal.h> void alarmhandler(){ printf("\nTimer triggered"); } void main(){ struct itimerval timerval; signal(SIGALRM, alarmhandler); timerval.it_value.tv_sec = 1; timerval.it_value.tv_usec = 0; timerval.it_interval.tv_sec = 30; timerval.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &timerval, 0); pause(); } 来获取文件类型,但是如何编写file pic.jpg语句以在shell脚本中检查它?

E.g。 (伪代码):

if

3 个答案:

答案 0 :(得分:8)

尝试(假设 Bash v3.0 + ,使用=~,正则表达式匹配运算符):

if [[ $(file -b 'pic.jpg') =~ JPEG ]]; then ...

如果您想更紧密地匹配file的输出:

if [[ $(file -b 'pic.jpg') =~ ^'JPEG ' ]]; then ...

仅当输出以&#39; JPEG&#39;开头,后跟空格时才会匹配。

或者,如果您更喜欢使用通配样式:

if [[ $(file -b 'pic.jpg') == 'JPEG '* ]]; then ...

POSIX兼容条件([ ... ]提供正则表达式或模式匹配,因此需要采用不同的方法:

if expr "$(file -b 'pic.jpg')" : 'JPEG ' >/dev/null; then ...

注意:expr仅支持基本正则表达式,并隐式锚定在字符串的开头(不需要^)。

至于为什么在Bash片段中需要[[ ... ]]而不是[ ... ]
 高级功能(如正则表达式运算符(=~)或模式匹配(例如,使用不带引号的*来表示任何字符序列。)是非标准的(不是POSIX shell规范的一部分)。 /> 由于这些功能不兼容标准条件([ ... ])如何工作,因此需要新的语法; Bash,Ksh和Zsh使用[[ ... ]]

答案 1 :(得分:3)

好老case也值得一提。

case $(file -b pic.jpg) in
  'JPEG '*)
    echo is
    ;;
  *)
    echo is not
    ;;
esac

单独的右括号起初看起来似乎是不可思议的,但除此之外,这是相当简单,可读,多功能和可移植的方式回到原始的Bourne shell。 (POSIX也允许在表达式之前匹配左括号。)

答案 2 :(得分:2)

对于JPEG文件,file -b输出有JPEG作为该行的第一个字:

pax> file -b somefile.jpg
JPEG image data, JFIF standard 1.01, blah blah blah

因此,您可以使用它来检测它:

inputFile=somefile.jpg
if [[ $(file -b $testFile | awk '{print $1}') == "JPEG" ]] ; then
    echo $inputFile is a JPEG file.
fi