シェルスクリプトファイルの実行権限を確認して割り当てる方法は?

シェルスクリプトファイルの実行権限を確認して割り当てる方法は?

現在、ディレクトリとまだ実行権限が割り当てられていないサブディレクトリのすべての.shファイルに実行権限を割り当てる.shスクリプトを作成しています。

単一のコマンドで、現在のディレクトリとそのサブディレクトリに含まれるすべての.shファイルに実行権限を簡単に割り当てることができます。

find -type f -iname '*.sh' -exec chmod +x {} \;

上記のコマンドは、現在のディレクトリとサブディレクトリのすべての.shファイルに実行権限を割り当てます。しかし、この.shファイルに実行権限が割り当てられていることを確認するには、条件文のみが必要ですか?それ以外の場合は、ファイルに実行権限を割り当てるコマンドを実行します。

あなたの回答は非常に役に立ち、あなたの答えに非常に感謝します。

答え1

探していると思います。-executableオプション、否定する-not

$ ls -l
-rwxrwxr-x ... cmd.sh
-rw-rw-r-- ... foo.txt

$ find . -not -executable
./foo.txt

したがって、あなたの場合は、次のようにすることができます。

find -type f -iname '*.sh' -not -executable -exec chmod +x {} \;

答え2

オプションを試してみました-perm

find . -perm /a=x 

どこでもxビットが一致a

だからあなたは必要です

find . -not -perm /a=x

これは許可された答えのあいまいな形です。

あなたはそれを使用することができます

find -perm /go=x

gグループまたはo実行可能ファイルと一致します。

残念ながら、欠落しているビットを直接テストすることはできません。

答え3

ファイルが実行可能であることを確認する必要はありません。chmodファイルにすでに割り当てられている権限がある場合、コマンドは失敗しません。ファイルの権限を最初に確認すると、何も保存されません。

私がこのコマンドに提案したい唯一の変更は、ファイルごとにchmod一度ではなく、できるだけ多くのファイルに対して一度呼び出すことです。

find . -name '*.sh' -type f -exec chmod +x {} +

非標準-inameテストも一般-nameテストに変更しました。実際に.sh、、、.Shおよび.sHファイル名のサフィックスを含むファイルが混在していないとします.SH。もしあれば、それを修正したいかもしれません。実行方法は次のとおりです。

find . -type f -iname '*.sh' ! -name '*.sh' -exec sh -c '
    for pathname do
        mv "$pathname" "${pathname%.??}.sh"
    done' sh {} +

ファイル名の競合はここでは解決されません。 GNUシステムを使用している場合、mv -b名前の競合が発生した場合はそれを使用してバックアップを作成できます。いつものように、まずバックアップデータのコピーからランダムな人のコードをテストします。

関連情報