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 {} +

おすすめ記事