2010-12-06 2 views
3

Я просто хочу сделать простую вещь. Я получил следующие файлы в каталоге:Почему не работает, как я ожидаю?

AppInterface.h baa PEMsg.h PluginInterface.h 

Затем я выполняю команду:

ls | grep -v ".h" | rm -rf 

К моему ужасу, baa не удаляются. Но это:

ls | grep -v ".h" 

дает baa, как я ожидал. Поэтому я думаю, проблема связана с тем, как принимает rm, но я не знаю почему. Пробовал это как в csh, так и в bash.

ответ

8

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

Вам нужно

rm `ls | grep -v ".h"` 

или

ls | grep -v ".h" | xargs rm -rf 
+0

Что делает `rm` принимать ввод от этого? И почему это различие? – nakiya 2010-12-06 10:58:32

+2

Rm принимает список файлов для удаления только из командной строки. Версия backticks `` исполняет ls и grep и заменяет вывод в командной строке для rm. xargs принимает свой вход от stdin и вызывает команду (rm -rf в этом случае) с вводом в качестве аргументов командной строки. xargs лучше, когда есть много входных данных для обработки, или сложная обработка необходима на входе, прежде чем она будет передана команде. – 2010-12-06 11:15:22

4

Вы хотите использовать xargs:

ls | grep -v ".h" | xargs rm -rf 
1

rm не принимает аргументы из стандартного ввода. То, что вы, вероятно, ищете это команда замещение (обозначено кавычкой здесь), где результат одной команды может быть вставлен в аргументы другой:

rm -rf `ls | grep -v ".h"` 
2

rm не читает список файлов со стандартного ввода, поэтому он не работает. Вы не можете передать список имен файлов в rm.

правильный способ сделать это было бы

find . -maxdepth 1 -not -name '*.h' -exec rm -rf {} + 

Используя универсальный find утилиту. Если вы считаете, что это похоже на большую работу: это цена правильности. Но, действительно, это не намного хуже, если вы знакомы с находкой.

Смежные вопросы