1

Мне нужно удалить все файлы в каталоге, кроме одного файла и одной папки. До grep я могу вывести правильный список элементов, которые я хочу удалить, но когда я добавляю xags, ничего не удаляется.

это команда, которую я использую.

ls domain.com/wp-content/themes | grep -v -E 'twentyeleven|index.php'  | xargs rm -rf

2 ответа2

0

Вы могли бы решить это с помощью еще одного диагноза,

команда работает на практике, на простом примере.

Так что все, что вам нужно сделать, это немного устранения неполадок.

Похоже, что вы выполнили поиск и устранение неисправностей до момента обнаружения ls domain.com/wp-content/themes | grep -v -E 'twentyeleven | index.php'
выглядит хорошо.

Попробуйте ls file1 file2 file3 из этого каталога. | рм-рф

Попробуй echo file1 file2 file3 | рм-рф

Попробуйте другой каталог, может быть, есть какая-то проблема с этим. Устранение основных неполадок приведет вас гораздо дальше, возможно, к решению.

Вот пример, который работает. Проверено в Cygwin.

user@iar ~/aa
$ ls | grep -v -E "op"
er
qw
ty
ui

user@iar ~/aa
$ ls | grep -v -E "op" | xargs rm -rf

user@iar ~/aa
$ ls
op

user@iar ~/aa
$
0

Прежде всего, вы хотите использовать 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!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .