Запрашивать Bash cd в каждый каталог по некоторому пути и запускать команду, когда он находится внутри?

Хорошо, у меня была та же проблема, и это решило ее:

  • удаление «руководства iface eth0 inet», которое, вероятно, осталось там по ошибке.
  • добавляя строку 'auto eth0', она отсутствовала.

После этого eth0 появился безупречно, aiccu и radvd теперь работают правильно :)

2
08.04.2017, 00:40
3 ответа

Давайте сначала разберем вашу команду:

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. Оболочка будет расширяться * (та, что на вашем компакт-диске * ). Обратите внимание, что это текущий рабочий каталог. Предположим, у вас есть поп и пирог .
  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
4
27.01.2020, 21:53

Давайте создадим сценарий оболочки tmp.sh, который перейдет по cd в ваш каталог и выполнит работу. Теперь cd в дочернем каталоге не влияет на родительский, поэтому после выхода скрипта вы вернетесь в вызывающий каталог

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

и тогда

 type d -name 'phpmyadmin' -maxdepth 0 ! -exec ./tmp.sh '{}' \;
1
27.01.2020, 21:53

Другой способ - использовать небольшой цикл 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
1
27.01.2020, 21:53

Теги

Похожие вопросы