#linux #shell #find
есть,скажем, команда find /Users/mac/Downloads/topdf -exec sh -c "ls -l {}" \; вот что выводит: я не понимаю как тут работают фигурные скобки. То есть понятно, что по результату с помощью {} программа выводит листинг про каждый файл, а потом то же самое, но плюс еще и путь к файлу но что она ставит вместо фигурных скобок ? что-то типа find /Users/mac/Downloads/topdf -exec sh -c "ls -l /Users/mac/Downloads/topdf/file1.pdf" \; потом find /Users/mac/Downloads/topdf -exec sh -c "ls -l /Users/mac/Downloads/topdf/file2.pdf" \; или я не так понимаю ? Буду благодарен за объяснение
Ответы
Ответ 1
В данном случае фигурные скобки не имеют отношения к языку оболочки, они интерпретируются исключительно утилитой find. Ключ -exec для каждого найденного файла запускает процесс указанный в его параметрах, при этом заменяя строку {} на имя аргумента; в данном случае он по очереди запустит: sh -c "ls -l /Users/mac/Downloads/topdf/." sh -c "ls -l /Users/mac/Downloads/topdf/file1.pdf" sh -c "ls -l /Users/mac/Downloads/topdf/file2.pdf" # ... итд Замечания: Порядок обхода файлов не определён Некоторые реализации find допускают замену строки '{}' только в случае если она является отдельным аргументом. Для них пришлось бы писать нечто подобное: find -exec sh -c 'ls -l "$0"' '{}' \; К GNU и FreeBSD find это не относится. Обычно не прибегают к дополнительному вызову sh и сразу взывают необходимую утилиту, например ls: find -exec ls -l '{}' \; Окромя лучшей производительности у этого способа есть и другое важное преимущество — он корректно обрабатывает файлы с пробелами и/или переводами строк в именах. см. man find
Комментариев нет:
Отправить комментарий