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

答え2

tmp.shディレクトリにCDを挿入し、操作を実行するシェルスクリプトを作成しましょう。これで、子プロセスのcdは親プロセスに影響を与えないため、スクリプトの終了後に呼び出しディレクトリに戻ります。

#!/bin/sh
cd "$1" 
wp plugin update --all

それから

 type d -name 'phpmyadmin' -maxdepth 0 ! -exec ./tmp.sh '{}' \;

答え3

別のアプローチは、小さなforループを使用することです。と組み合わせることができます。

for folder in */; do <your-commands-on-$folder>; done

あなたの例を使用すると、次のようになります。

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

関連情報