如何在bash脚本中列出文件并匹配第一行?

时间:2015-09-05 02:00:21

标签: bash shell terminal sh

我想检查(仅)第一行中没有#!/usr/bin/env python的python文件。所以,我写了一个执行以下操作的bash脚本:

#!/bin/bash

#list all of python files

for file in `find . -name "*.py"`
do
        if [ `head -1 $file` != "#!/usr/bin/env python"] then;
                 echo "no match in file $file"
        else then;
                 echo "match!"
        fi
done

但是,出于某种原因,我无法正确地发现if声明!我已经看了很多问题,但我找不到一个简洁地描述这个问题的问题。以下是错误消息:

./run_test.sh: line 9: syntax error near unexpected token `else'
./run_test.sh: line 9: `    else then;'

我哪里出错了?谢谢。

3 个答案:

答案 0 :(得分:2)

您可以执行类似

的操作
find . -type f -name '*.py' -exec \
  awk 'NR==1 && /#!\/usr\/bin\/env python/ \
  { print "Match in file " FILENAME; exit } \
  { print "No match in file " FILENAME; exit }' \
{} \;

如果要循环播放,don't use a for loop

#!/bin/bash
find . -type f -name '*.py' -print0 | while IFS= read -r -d $'\0' file; do
  if [[ $(head -n1 "$file") == "#!/usr/bin/env python" ]]; then
      echo "Match in file [$file]"
  else
      echo "No match in file [$file]"
  fi
done

答案 1 :(得分:1)

需要注意的事项:

  1. if语句之后的[]需要正确的间距
  2. ';' (如果您不需要输入新行)请在之后而不是然后
  3. 之后
  4. 您在else之后添加了一个额外的然后

    #!/bin/bash
    
    #list all of python files
    
    for file in `find . -name "*.py"` 
    do
         if [ `head -1 $file` != "#!/usr/bin/env python" ]; 
         then
             echo "no match in file $file"
         else 
             echo "match!"
         fi
    done
    

答案 2 :(得分:-1)

你有机会使用-exec选项吗?我发现它更容易。

find . -name "*.py" -exec head -1 {} | grep -H '#!/usr/bin/env python' \;

您可以使用grep选项控制输出。

修改

感谢@chepner - 为了避免过早吞下管道:

-exec sh -c "head -1 {} | grep -H '#!/usr/bin/env python'" \;