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

find . -maxdepth 1 -type d | grep -E -i 'sensors' | grep -v '.test' | xargs find -name '*.java'

Но выкидывает следующую ошибку

find: paths must precede expression

3 ответа3

1

Используйте xargs вариант , который нравится в -i find -exec вариант s заменяет {} с путями.

... | xargs -i find "{}" -name '*.java'
1

Первый поиск приведет к тому, что второй поиск перечислит все дважды, если вы не исключите также текущий каталог. Это происходит потому, что вывод первой находки содержит точку.

$ find -maxdepth 1 -type d -print0 |
   grep -z -v -Ee 'sensors|\.test' |
   xargs.exe -0 -I% find % -name '*.java' |
   sort
  ./dirz/3.java
  ./dirz/3.java
  ./foo/2.java
  ./foo/2.java
  ./moo/1.java
  ./moo/1.java

Вам лучше делать что-то вроде этого:

$ find . -type f -name \*java | grep -v -Ee './(sensors|\.test)'
./dirz/3.java
./foo/2.java
./moo/1.java

Или даже:

$ echo dirz foo moo | tr \  \\n  > .search-dirs

$ find `cat .search-dirs` -type f -name \*java
dirz/3.java
foo/2.java
moo/1.java
1

Вы можете сделать это непосредственно в 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 должен объяснить переключатели четко и, вероятно, лучше, чем я.

Трубопровод мощен, но базовые инструменты сами по себе обрабатывают многие сценарии более простым способом. Это позволяет избежать ненужных разветвлений процесса и сводит к минимуму незначительные ошибки.

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