Трубопровод найти найти - PullRequest
11 голосов
/ 25 апреля 2011

Я хочу передать результаты поиска новой находке. Что у меня есть:

find . -iname "2010-06*" -maxdepth 1 -type d | xargs -0 find '{}' -iname "*.jpg"

Ожидаемый результат: второй поиск получает список папок, начиная с 2010-06, второй поиск возвращает список jpg, содержащихся в этих папках.

Фактический результат: "find: ./2010-06 New York \ n: неизвестная опция"

О черт. У меня есть ощущение, что это касается формата вывода, который вторая находка получает в качестве ввода, но моя единственная идея заключалась в добавлении суффикса -print0 к первому обнаружению без каких-либо изменений.

Есть идеи?

Ответы [ 4 ]

10 голосов
/ 25 апреля 2011

Вам нужно 2 вещи.-print0 и, что более важно, -I{} на xargs, в противном случае {} ничего не делает.

find . -iname "2010-06*" -maxdepth 1 -type d -print0 | xargs -0 -I{} find '{}' -iname '*.jpg'
6 голосов
/ 25 апреля 2011

Бесполезное использование xargs.

find 2010-06* -iname "*.jpg"

По крайней мере, Gnu-find принимает несколько путей для поиска в. -Maxdepth и тип -d подразумевается.

2 голосов
/ 25 апреля 2011

Как насчет

find . -iwholename "./2010-06*/*.jpg 

и т.д.

1 голос
/ 25 апреля 2011

Хотя вы и говорили, что специально хотите, чтобы эта проблема поиска + трубы работала, неэффективно использовать дополнительную команду find. Поскольку вы указываете -maxdepth как 1, вы не пересекаете подкаталоги. Так что просто используйте for цикл с расширением оболочки.

for file in *2010-06*/*.jpg
do
  echo "$file"
done

Если вы хотите найти все файлы jpg внутри каждой папки 2010-06 * рекурсивно, то также нет необходимости использовать несколько finds или xargs

for directory in 2010-06*/
do
   find $directory -iname "*.jpg" -type f
done

Или просто

find 2006-06* -type f -iname "*.jpg"

Или даже лучше, если у вас bash 4 и выше

shopt -s globstar
shopt -s nullglob
for file in 2010-06*/**/*.jpg
do
    echo "$file"
done
...