Bashに特定のパスの下のすべてのディレクトリにCDを挿入し、そのディレクトリからコマンドを実行するように依頼しますか?

Bashに特定のパスの下のすべてのディレクトリにCDを挿入し、そのディレクトリからコマンドを実行するように依頼しますか?

たとえば、次のパスを選択します/var/www/html

dirの内部にはhtmlいくつかのサブディレクトリがあります。cdこれらの各サブディレクトリに移動しcd、そのディレクトリ内でコマンドを実行して/var/www/htmlに戻り、次のディレクトリに対してプロセスを繰り返すにはシステムが必要です。

私が試した方法は次のとおりです。しかし、うまくいかないようです。

find /var/www/html/* -type d -maxdepth 0 ! -name 'phpmyadmin' -exec cd * && wp plugin update --all {} \;

ベストアンサー1

まず、コマンドを解いてみましょう。

find /var/www/html/* -type d -name 'phpmyadmin' -maxdepth 0 ! -exec cd * && wp plugin update --all {} \;

これが実際に行うことは次のとおりです。

  1. シェルが展開されます/var/www/html/*/var/www/html/fooまで拡張されると仮定しましょう/var/www/html/bar
  2. 知覚が拡張されます*(知覚内の知覚cd *)。これが現在の作業ディレクトリであることに注意してください。あなたが持っているとpopしますtart
  3. シェルが実行されますfind /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart
  4. find終了していないコマンドに対してエラーが発生します。なぜなら、また-execはがないからです。;+

したがって、何が起こっているのかを明確に理解するために、シェルは行を分割し、必要な部分だけを引数として渡しますfind

最もクリーンで簡単な方法findは次のとおりです。

find /var/www/html/* -type d -name phpmyadmin -maxdepth 0 -exec sh -c 'cd "$1" && wp plugin update --all' -- {} \;

これはコマンド全体を引用して供給し、ディレクトリをsh引数として渡します。

これも個人的な好みですが、このような場合には使わない方が簡単だと言いたいですfind

for dir in /var/www/html/*/; do cd "$dir" && wp plugin update --all; done

おすすめ記事