Вы можете сделать это непосредственно в find
; нет необходимости привлекать grep
или xargs
.
Со структурой каталогов, как:
$ ls *
a_sensors_directory:
my_file.java my_non_java_file.txt
a_sensors_directory.test:
my_file.java my_non_java_file.txt
something_else:
my_file.java my_non_java_file.txt
эта команда GNU find
выберет файлы, оканчивающиеся на .java
в каталогах текущего рабочего каталога, которые содержат слово sensors
, но не заканчиваются на .test
(если я правильно интерпретировал ваш вопрос):
$ find -type f -ipath './*sensors*' -not -ipath './*.test/*' -iname '*.java'
./a_sensors_directory/my_file.java
man find
должен объяснить переключатели четко и, вероятно, лучше, чем я.
Трубопровод мощен, но базовые инструменты сами по себе обрабатывают многие сценарии более простым способом. Это позволяет избежать ненужных разветвлений процесса и сводит к минимуму незначительные ошибки.