Использование xargs с find

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

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

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

find: paths must precede expression

3 ответа

Решение

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

$ 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

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

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

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

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

Другие вопросы по тегам