たとえば、次のパスを選択します/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 {} \;
これが実際に行うことは次のとおりです。
- シェルが展開されます
/var/www/html/*
。/var/www/html/foo
まで拡張されると仮定しましょう/var/www/html/bar
。 - 知覚が拡張されます
*
(知覚内の知覚cd *
)。これが現在の作業ディレクトリであることに注意してください。あなたが持っているとpop
しますtart
。 - シェルが実行されます
find /var/www/html/foo /var/www/html/bar -type d -name phpmyadmin -maxdepth 0 ! -exec cd pop tart
。 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