Команда SSH для циклического прохождения по каталогам ЗА ИСКЛЮЧЕНИЕМ нескольких указанных - PullRequest
3 голосов
/ 10 декабря 2010

Можно ли выполнить команду bash через SSH, которая зацикливается на нескольких каталогах, КРОМЕ 3 или 4, которые я указываю? Что-то вроде:

Удалить public_html/outdated/ для всех каталогов в /home/, кроме /home/exception1/, /home/exception2/ и /home/exception3/

Я на выделенном сервере Linux HostGator.

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

Это все одна строка, но я разбил ее здесь для удобства чтения

find /home
    \( -wholename '/home/exception1'
    -o -wholename '/home/exception2'
    -o -wholename '/home/exception3' \)
    -prune -o
  -wholename '*/public_html/outdated' -type d
  -exec rm -rvf \{} \;

Перед запуском настоятельно рекомендуем заменить бит -exec rm -rvf \{} \; на -print, чтобы убедиться, что он печатает только то, что вы хотите удалить.

Вот как это работает: find рекурсивно находит вещи. материал в \( ... \)' matches directories you want to skip entirely (ie: prune). The standard pattern for using -prune is to say what you want to prune out, then -prune -o`, а затем материал, который вы действительно хотите сопоставить.

Мы хотим сопоставить каталоги public_html/outdated, так что для этого -wholename '*/public_html/outdated' -type d. (-type d означает «каталог»).

Наконец приходит действие, которое мы хотим выполнить. Еще раз замените эту часть на -print, пока не убедитесь, что она делает то, что вы хотите.

Одно предостережение: это выдаст кучу предупреждений вида:

find: `/home/foo/public_html/outdated': No such file or directory

Это потому, что find пытается войти в те каталоги, которые он только что удалил. Вы можете спокойно их игнорировать - поиск будет продолжен, несмотря на предупреждения.

2 голосов
/ 11 декабря 2010

Сначала тест!

shopt -s extglob
rm -rf /home/!(exception1|exception2|exception3)/public_html/outdated/
1 голос
/ 10 декабря 2010

Вот простое решение - возможно, есть лучшие способы сделать это.

cd /home
ls */public_html/outdated

будет вам всем этим; вы можете использовать grep -v для удаления строк из этого

ls */public_html/outdated | grep -Ev ^exception1/ | grep -Ev ^exception2/ | grep -Ev ^exception3/

, а затем используйте обратные метки, чтобы вставить их в rm -rf

rm -rf `ls */public_html/outdated | grep -Ev ^exception1/ | grep -Ev ^exception2/ | grep -Ev ^exception3/`

Очевидно, вам следует выполнить средний шаг, чтобы проверить список, прежде чем вы действительно удалите их!

Обратите внимание, что это может не сработать, если в любом из ваших каталогов есть пробелы - хотя имена пользователей в / home не должны. Безопасный способ сделать это - использовать find. (Возможно, есть способ сделать исключение с помощью find, но я никогда не смогу вспомнить.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...