unix で、 特定のディレクトリで、 shebang が /bin/sh のものだけ実行権限を付与したい


諸事情により、特定のディレクトリの中の、実行権限がすべて吹っ飛んでしまいました; すべて 664 のパーミッションになっています。

このディレクトリには、実行可能(だったはずの)シェルスクリプトと、 windows 用の .bat ファイルが混合しています。

この状態で、実行可能だったはずのシェルスクリプトすべてに実行権限を付与したいと考えています。具体的には、実行可能だったシェルスクリプトは、すべて
shebang が #!/bin/sh だったので、これらに対して chmod を実行したいのですが、これを、なるべく簡単に実現する方法はありますか？




`file`コマンドでファイルの種類を調べられます。手元の環境ですと

[code]

    $ file -bi bin/some.sh
    text/x-shellscript; charset=us-ascii
    
[/code]

という出力を得られますので、この文字列が含まれるか`grep`で判定できます。

[code]

    $ file -bi bin/some.sh | grep -q 'text/x-shellscript' && echo "shell script!"
    shell script!
    
[/code]

あとはこれをループしてやればいいでしょう。

[code]

    $ for f in somedir/*; do file -bi "$f" | grep -q 'text/x-shellscript' && echo chmod +x "$f"; done
    chmod +x bin/some.sh
    ...
    
[/code]

問題なさそうなら`echo`を消せば`chmod`が実行されます。




`file`コマンドでファイルの種類を調べられます。手元の環境ですと

[code]

    $ file -bi bin/some.sh
    text/x-shellscript; charset=us-ascii
    
[/code]

という出力を得られますので、この文字列が含まれるか`grep`で判定できます。

[code]

    $ file -bi bin/some.sh | grep -q 'text/x-shellscript' && echo "shell script!"
    shell script!
    
[/code]

あとはこれをループしてやればいいでしょう。

[code]

    $ for f in somedir/*; do file -bi "$f" | grep -q 'text/x-shellscript' && echo chmod +x "$f"; done
    chmod +x bin/some.sh
    ...
    
[/code]

問題なさそうなら`echo`を消せば`chmod`が実行されます。

