Використання xargs з find


0

Я хочу виключити деякі каталоги з пошуку файлів і запустити команду find, щоб знайти потрібні файли. Я використовую команду нижче

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

Але це кидає наступну помилку

find: paths must precede expression

Відповіді:


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

Використовуйте xargs« -iваріант , який як в find" s -execваріант замінює {}зі шляхами.

... | xargs -i find "{}" -name '*.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 слід чітко пояснити комутатори і, можливо, краще, ніж я б.

Трубопровід є потужним, але базові інструменти самі справляються з багатьма сценаріями більш просто. Це дозволяє уникнути непотрібних процесових вил і утримує тонкі помилки до мінімуму.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.