.htaccess
本質的に同じ作業(サイトの主要コンテンツの検索と変更)を実行するように設計された次のコードを見てください。
for dir in "$HOME"/public_html/*.{com,co.il}/; do
if pushd "$dir"; then
chmod 644 .htaccess
popd
fi
done 2>/dev/null
そして:
find "$HOME"/public_html/*.{com,co.il} -name ".htaccess" -exec chmod 644 {} \;
これは.htaccess
各ディレクトリのサブディレクトリにあるファイルにも影響しますかpublic_html
?
答え1
実際、最初のループはリストされたディレクトリ構造内のファイルのみを考慮します(もちろんワイルドカードが埋め込まれています)。リストされたコマンドは、find
任意のレベルのディレクトリ構造に限定されず、任意のディレクトリchmod
構造で実行できます。そしてディレクトリツリーに.htaccessというファイルがあります。
コマンドを起動ディレクトリ構造に限定するにはfind
(globで複数の起動ディレクトリを指定したことに注意してください)、述語を追加してください-maxdepth 1
。
find "$HOME"/public_html/*.{com,co.il} -maxdepth 1 -name ".htaccess" -exec chmod 644 {} \;
答え2
最初のコードスニペット:
for dir in "$HOME"/public_html/*.{com,co.il}/; do
if pushd "$dir"; then
chmod 644 .htaccess
popd
fi
done 2>/dev/null
これは、次のようにディレクトリに入ったり出たりすることなくオーバーライドできます。
for dir in "$HOME"/public_html/*.{com,co.il}/; do
chmod 644 "$dir/.htaccess"
done 2>/dev/null
これは、次のように短縮または最小限に変更することもできます。
for pathname in "$HOME"/public_html/*.{com,co.il}/.htaccess; do
chmod 644 "$pathname"
done 2>/dev/null
これらのファイルが多すぎない場合は、次の操作を実行できます。
chmod 644 "$HOME"/public_html/*.{com,co.il}/.htaccess 2>/dev/null
これは、ディレクトリ構造を詳しく見るのではなく、.htaccess
サブディレクトリにあるファイルだけを調べます。public_html
最後の2つの亜種はchmod
ファイルの損失を試みません。元のループと最初の変形仮説特定のディレクトリにファイルがあり、.htaccess
最後の2つのバリエーションは実際に存在するファイルを繰り返します。前のループは、ディレクトリにそのようなファイルが含まれているかどうかをテストする機会を提供しますが(ユーザーは実行しません)、後のコマンドはそのファイルが私たちが興味を持っている唯一のファイルであると仮定します。chmod
.htaccess
.htaccess
2番目のコードスニペット:
find "$HOME"/public_html/*.{com,co.il} -name ".htaccess" -exec chmod 644 {} \;
一方.htaccess
、で定義されたディレクトリまたはディレクトリの下のファイルを探します"$HOME"/public_html/*.{com,co.il}
。-maxdepth 1
beforeを追加すると、この問題を解決できます-name
。これにより、find
そのディレクトリのサブディレクトリへの再帰が停止され、強制的に最上位レベルで停止します。
-maxdepth 1
上記の最後の実際のループとほぼ同じ方法でfind
動作するように追加されました。
.htaccess
どちらのコマンドも、見つかったファイルが実際にはディレクトリなどではなく通常のファイルであることを確認しようとしません。ループではテストを介してこれを実行でき-f
、find
コマンドでは-type f
それを実行できます-exec
。