!!! Обратите внимание:
1 2 |
символ ' используется для обозначения последовательностей символов, a ` — для подстановки команд (см. выше). Эти символы не равнозначны! |
Подстановка команд:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
`` - кавычки на искосок Пользуясь подстановкой команд, можно заменить команду в командной строке результатом этой команды. Для этого команда должна быть заключена между двумя символами \ Альтернативная запись — $(команда). Второй метод предпочтителен, так как, во-первых, в таком случае вы избегаете путаницы с тремя разными кавычками (", ' и v), во-вторых, второй метод допускает вложения. Обозначенная таким образом команда будет заменена результатом ее выполнения. Подобная запись обеспечивает вложенный вызов нескольких команд, причем одна команда передает результат своего выполнения другой. Две представленные далее равнозначные команды проясняют принцип работы этого чрезвычайно мощного механизма: ls -lgo `find /usr/share -name '*README*' ls -lgo $(find /usr/share -name '*README*') Вышеуказанная команда сначала выполняет find /usr/share -name '*README*'. Результат выполнения этой команды — список всех файлов, находящихся в каталоге /usr/share и содержащих последовательность символов README. Теперь этот список вставляется в командную строку на месте команды find. Тогда командная строка может записываться следующим образом: Получить такой результат, используя обычный программный канал с символом не удастся. Команда ls не ожидает никакого стандартного ввода, а также игнорирует информацию, передаваемую find через программный канал. И именно поэтому следующая команда отображает только содержимое текущего каталога. Результаты find выводиться не будут! (не работает!) find /usr/share -name '*README*' | ls -l Есть еще одно решение, позволяющее обойтись без подстановки команд: с помощью команды xargs данные стандартного ввода передаются указанной команде: find /usr/share -name '*README*' | xargs ls -1 Важное достоинство xargs заключается в том, что объем данных, которые можно переработать, ничем не ограничен. При необходимости xargs вызывает команду неоднократно и передает получаемые данные в стандартный ввод в несколько этапов. Напротив, при подстановке команд максимальная длина командной строки ограничена, как правило, несколькими тысячами символов. Если в именах файлов содержатся пробелы, передача таких имен может вызывать затруднения. Чтобы избежать этих проблем, передайте команде find параметр -printO, а команде xargs — параметр -null. Следующая команда ставит для всех каталогов бит execute: find -type d -printO | xargs --null chmod a+x |
Примеры:
1 2 3 |
ls -lgo `find /usr/share -name '*README*' ls -lgo $(find /usr/share -name '*README*') find -type d -printO | xargs --null chmod a+x |
find + rm:
1 2 3 4 |
Следующая команда удаляет все резервные копии, содержащиеся в данном каталоге и во всех подкаталогах. При этом find строит список всех сомнительных файлов и передает его команде rm через подстановку команды ($(команда)). rm $(find . -name '*-') |