Использование 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
Я должен объяснить переключатели четко и, вероятно, лучше, чем я.
Трубопровод мощен, но базовые инструменты сами по себе обрабатывают многие сценарии более простым способом. Это позволяет избежать ненужных разветвлений процесса и сводит к минимуму незначительные ошибки.