Что-то вроде следующего - это то, что я хочу, но мой код не работает, независимо от того, как я убегаю {}
и+
;
find ./ -maxdepth 1 -type d -name '.*' -exec \
find {} -maxdepth 1 -type f -name '*.ini' -exec \
md5sum \{\} \\; \;
Посмотрев этот вопрос по Unix - & - Linux , я обнаружил, что следующий код работает, но это не вложенный поиск как таковой, и я подозреваю, что есть лучший способ сделать эту конкретную работу.
find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
find "$x" -maxdepth 1 -type f -name "*.ini" \
-exec md5sum \{\} \;; \
done' _ {} \+
Есть ли какой-нибудь способ вложения find -exec
без необходимости вызывать оболочку (как указано выше) со всеми ее причудливыми ограничениями на кавычки и экранированием?
Или это можно сделать непосредственно в одной команде поиска, используя сочетание множества параметров?
text-processing
find
filenames
Peter.O
источник
источник
find
, но еслиfind
вы не можете этого сделать, то почемуfind
так почитается (?) Как инструмент использовать для поиска файлов? ... Впоследствии я обнаружил, что этоfind ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+
прекрасно работает в моей ситуации (ссылка на jw013-prune
привела меня к этому на странице руководства), но мне интересно, является ли это надежным методом (в общем). Я никогда не использовалfind
(менее чем за год Linux), посколькуlocate
сделал почти все, что мне нужно, так что это неизвестная территория.-path
Тест именно то , что я собирался предложить. При этом вы сможете делать все, что хотите (извините за ассоциацию Ace Of Base;))Ответы:
Я бы попробовал использовать одну находку как:
или даже (нет
find
вообще, просто ракушка)хотя здесь нет
-type f
проверки, поэтому работает, только если у вас нет каталогов / файлов, заканчивающихся на.ini
. Если бы вы могли использоватьчто, однако, потеряло бы преимущество только одного вызова md5sum.
редактировать
Для общего и безопасного метода цепочки
find
вы можете сделать что-то вродеисточник
-f
(f?), А затем еще одну ошибку с-execdir
.. Когда я заменяю -execdir на -exec и / или заменяю md5sum на print, я ничего не получаю ..find
... Это не так много, что я просто хочу, чтобы этот пример был решен, я ищу понимание способов найти фу .. Может быть, там больше пуха, чем fu в find ... (я не знаю, потому что я практически никогда не использовал его), и это первая ситуация, в которой я действительно хотел ее использовать (для файлов изображений на самом деле) и Функция -exec, о которой я так много слышал, кажется не такой мощной, как ее rep (?), намекает на ... (+1 для альтернатив, хотя) .. но вашfind
пример просто не работает (все же )find
команды: ...find: The relative path
~ / bin 'включен в переменную среды PATH, которая небезопасна в сочетании с действием -execdir команды find. Пожалуйста, удалите эту запись из $ PATH` .... Так что, возможно, это сработает, но я должен сказать, что пытался избавиться от этого ~ / bin какое-то время сейчас ... Мне нужно больше серьезный взгляд на это ... я не знаю, где я это установил ... любые идеи, где это может скрываться;~/bin
в моем PATHfind
лучше всего ценится в ситуациях, которые не могут быть полностью выполнены с помощью шариков, но поскольку такие ситуации встречаются редко, мне обычно не нужно много искать.Ваша первоначальная проблема не требует рекурсивного вызова функции find, но я полагаю, что это не главное.
Я считаю, что невозможно найти рекурсивный вызов так, как вы хотите.
Следующее также не вызывает рекурсивный вызов (или вложение, как бы оно ни называлось), но разве вы не можете просто взять набор результатов первого поиска и передать его второму? Вот как я бы инстинктивно поступил:
Вы также можете использовать
xargs
для выполнения второй находки.Обновить:
Я хотел бы добавить, что, поскольку большинство утилит UNIX принимают несколько аргументов имени файла вместо одного, обычно можно
-exec
вообще избежать :При вложении обратных косяков вы просто добавляете обратные косые черты
\
перед внутренними.Если мы представим, что
md5sum
требуется только один аргумент имени файла, мы всегда можем заключить его вfor
цикл:Обратите внимание, что это становится более трудным, если
-
задействованы имена файлов / каталогов, начинающиеся с пробела или содержащие его. Утилиты UNIX не очень хорошо с ними работают. В этом случае добавление./
,--
или кавычки необходимы.Очевидно, оригинальный пример не очень хороший, потому что мы могли бы просто сделать:
источник
find
методы выдают ошибку, когда файл / каталог содержит пробелы ...md5sum .*/*.ini
Работает нормально ... Я начинаю понимать, что * Уоррен Янг * комментарий о том, что вещи становятся «сложными»,find
происходит на ранних этапах игры :), но я предполагаю, что ониfind
вступают в свои права, когда тесты условий более сложны, но что касается вложенности -exec, я довольно неплохо отбросил эту идею, как кажется, есть более простые способы сделать это ... (но perl не "прост" для меня (пока) ...По крайней мере мне удалось вложить 2 команды поиска:
Но я не решил вызвать другой -exec (dir) - вызов оттуда.
источник