「bin」サブディレクトリ内のファイルのみに実行権限を付与する

「bin」サブディレクトリ内のファイルのみに実行権限を付与する

親ディレクトリには多数のアプリケーションが含まれており、それぞれにbinサブディレクトリがあります。

parent
--app1
  --bin
  --(maybe some other bins on even lower level)
--app2
  --bin
...

私がやりたいのは、binフォルダー自体ではなく、フォルダー内のファイルに実行権限を追加することです。

binただし、上記の構造は正規ではありません (そのため、ループを使用して特定の深さ/レベルにがあることを予測することはできません)。

これまでのところ、私が持っているのは次の通りです:

find /parent -type d -iname "bin" -exec chmod -R a+x {} \;

chmod -R各 に対して を実行しても問題ないことはわかっていますbinが、よりクリーンな方法を見つけるために、+xファイルにのみ を適用したいと思います。

答え1

xディレクトリに対して許可する必要があります: ディレクトリを一覧表示すること (およびディレクトリ内のファイルを検索する)xは、ディレクトリに対する権限を意味します。

とはいえ、

-exec chmod -R a+x {}/* \;

xdir 自体ではなく、dir の内容のみに割り当てられます。

ネストされたディレクトリに対応したい場合はbin、次のようなものを使用してください。

while read F; do \
  test -f "$F" || continue \
  test $(basename $(dirname "$F")) == "bin" || continue \
  chmod a+x "$F" \
done < find /path/to/base -type f

答え2

いくつかのアプローチがあります:

  • Eugen が述べたように、ディレクトリに +x を付けるのは普通です。コンテンツにアクセスするためにも必要です。スクリプトをワールド実行可能にする場合は、現在の方法を継続して、ディレクトリもワールド トラバース可能にするのが理にかなっています。

  • binbash の拡張グロブを使用すると、任意の深さのすべてのディレクトリを収集できます。

    shopt -s globstar; find **/bin/ -type f -exec chmod a+x {} \;
    

    同じですが、型チェックはありません:

    shopt -s globstar; chmod -R a+x **/bin/
    
  • 複数のfind呼び出しを使用します。

    find . -type d -name bin | while read -r path; do
        find "$path/" -type f -exec chmod a+x {} \;
    done
    

    (これはファイル名に改行が含まれていないことを前提としています。もし含まれている場合は心配する必要があり、使用例などを調整する必要があります-print0。)

  • find -exec残念ながら、別の 内に直接ネストすることはできませんfind -execが、その後 find -exec を呼び出すスクリプトを呼び出すことはできます。

    find . -type d -name bin -execdir sh -c "find . -type f -exec chmod a+x {} \;" \;
    

    面倒な {} ネストを回避するために-execdir、 の代わりにを使用します。-exec

関連情報