Прежде всего, вы хотите использовать ls -1
(число 1, а не строчную букву L), если вы хотите использовать grep для вывода.
Но главная проблема в том, что вы перечисляете содержимое подкаталога, но команда rm
выполняется в текущем каталоге.
Например, посмотрите это дерево каталогов (.
И ..
записи опущены)
a/
a/x
a/y
a/z
Допустим, вы хотите удалить все из каталога a, кроме файла y
и использовать команду, как вы пытались:
$ ls -1 a | grep -v 'y' | xargs rm -rf
ls -1 a
дает:
x
y
z
grep отфильтровывает строку с y
:
x
z
поэтому xargs выполняет следующую команду:
rm x z
Но он выполняет команду в каталоге верхнего уровня и видит только каталог a
, а не файлы x
и z
.
Чтобы заставить его работать, вам нужен путь к файлам - это легко сделать, применив небольшое изменение к команде ls . Также мы немного улучшили шаблон grep:
ls -1d a/* | grep -v '/y$' | xargs rm -rf
На этот раз ls выдает следующий вывод:
a/x
a/y
a/z
и последняя выполненная команда будет rm -rf a/x a/z
Итак, теперь давайте вернемся к вашей командной строке и применим обсуждаемые изменения:
$ ls -1d domain.com/wp-content/themes/* | grep -v -E '/twentyeleven$|/index.php$' | xargs rm -rf
И последнее замечание: использование xargs rm -rf
всегда выгодно (хотя иногда и необходимо) - сначала обязательно проверьте вывод команды grep!