shopt -s extglob が期待どおりに動作しません。

shopt -s extglob が期待どおりに動作しません。

WordPressのインストールでファイル権限を繰り返し変更しようとしています。これは、public_htmlドキュメントルートフォルダ(特定のフォルダを除く)の下のすべてのエントリに影響します。

私はextglobを次のように設定しました。shopt -s extglob

次のコマンドを実行すると、除外するフォルダを除外できません。 ls -R -alh ./public_html/!(*uploads*) | grep uploads

上記はアップロードフォルダに多数のファイルを一覧表示します。ファイルをリストしてはいけません。

もちろん、上記のコマンドは単なるテストです。chmod実際のスクリプトで使用します。

たとえば、次のようにさまざまな組み合わせを試しましたが、成功しませんでした。

ls -R -alh ./public_html/!(wp-content/uploads*)

ls: ./public_html/!(wp-content/uploads*) にアクセスできません。そのファイルやディレクトリはありません。

シェルコマンドで除外を使用しようとしたのは今回が初めてなので、単純な間違いを犯している可能性もあります。

何が間違っているのか、どんなアイデアがありますか?

注:質問の目的はextglobをよりよく理解することであり、代替案を見つけることではありません。代わりに書くことができますが、以前はextglobを使ったことがないので、構文を理解するのが難しいです。

答え1

まず、extglobはlsコマンドラインで表示される内容を制御します。もちろんいいえlsコマンドラインに表示される内容で実行される操作を制御します。これはナビゲーション-Rオプションを通知するので重要です。lsls再帰的コマンドラインに表示されるすべてのディレクトリ。したがって、*uploads*コマンドラインにディレクトリが明示的に提供されていない場合でも、親ディレクトリに移動するとlsそのディレクトリを見つけることができます。

第二に、ご存知のようにlsを解析しないでください。の出力はlsパイプやスクリプトでは機能しません。このように使用しようとすると、最終的に不幸につながります。

第三に、必要なファイルを取得するには、次のようにします。

find ./public_html ! -path '*uploads*'

説明する:

  • findにディレクトリから検索を./public_html開始するように指示します。./public_html

  • このオプション自体は、-path '*uploads*'パターンを含むすべてのパスと一致します*uploads*。 (findのoptionsに似ています-pathが、ディレクトリ名が含まれています。)しかし、上記は否定を意味します。したがって、このオプションは一致するパスを除外します。-namepath!! -path '*uploads*'*uploads*

ls機能を引き続き使用しながらスタイル付き出力を取得するには、次の点をfind考慮してください。

find ./public_html ! -path '*uploads*' -exec ls -dalh {} +

答え2

John1024はあなたの明白な問題のための良い解決策を追加しましたが、コメントに基づいてextglobをよりよく理解したいと思います。私は重要な誤解の1つがextglobが再帰的に機能すること、つまり./public_html/!(*uploads*)extglobsであることを除外する声明であると思います./public_html/wp-content/uploads/。 Globs(ファイル名拡張子)は、一度に単一のディレクトリレベルでのみ機能します。 bashのマニュアルに埋め込まれています。ファイル名拡張子例:

ファイル名を一致させるときは、スラッシュ文字は常に明示的に一致する必要があります。

したがって、John1024が述べたように、lsコマンドは任意の形式の(拡張)引数を取りませんが、たとえば1つの引数(除外パターンと一致しません)を持つことができ、./public_html/*uploads*再帰リストに渡されます。./public_html/wp-content-R

コマンドラインからextglobsを使用してディレクトリを除外するには、*uploads*サブディレクトリの数だけ除外エントリを含むコマンドを設定する必要があります。

ls -dalh ./public_html/!(*uploads*) \
         ./public_html/!(*uploads*)/!(*uploads*) \
         ./public_html/!(*uploads*)/!(*uploads*)/!(*uploads*)
# ... etc ...

...lsフラグを使用しないように注意してください-R-Rchmod コマンドにも同じリスクが適用されます。ここで潜在的なリスクの1つは、サブディレクトリに「あまりにも多くの」ファイルがあると危険にさらされることです。パラメータリストの入力のためのls。このアプローチは、作成したスキーマの数よりも深く新しく作成されたディレクトリをキャプチャできないため、脆弱であり、lsディレクトリが1つでも存在する場合は中断されます(ディレクトリの欠落について不平を言う)。少ないサブディレクトリの数が与えられたスキーマの数よりも多い。理由の長い説明探す作業に適したツールです。

関連情報