2015-06-22 4 views
0

Я пытаюсь найти все интерфейсы C# из заданного каталога. Я пытался делать эту команду:Выполнение команды в списке строк в Bash

find . -type f | xargs basename | grep ^I 

но basename дает обратно сообщение об ошибке, так как я посылаю это список строк, а не саму строку. Как получить вывод basename, выполненный поверх всех строк, переданных на него?

+1

Как насчет '... | xargs -i basename "{}" | ... '? – higuaro

+0

@higuaro Спасибо! (Кстати, вы можете поставить это как ответ.) –

+0

Есть ли какая-то проблема с 'echo I *'? (Возможно, вам действительно нужен рекурсивный список, или, может быть, у вас есть папки, имена которых начинаются с 'I'?) – rici

ответ

2

Вам не нужно использовать xargs для этого. Вы можете использовать:

find . -type f -name 'I*' -exec basename '{}' ';' 

Если вы используете GNU найти, вам не нужно basename либо:

find . -type f -name 'I*' -printf %f\\n 

Здесь %f является GNU найти формат PRINTF для «имени файла со всеми, кроме последнего компонент удален ". Существует много других возможных форматов; см. man find для деталей.

+0

Nice; они работали довольно быстро по сравнению с прокладкой через «xargs». –

+1

@JamesKo: второй должен быть самым быстрым, если ваш поиск поддерживает его, поскольку он не требует запуска любого нового процесса. – rici

1

Использование xargs -i должно решить проблему:

find . -type f | xargs -i basename "{}" | grep ^I