Я думаю, что я довольно продвинут в использовании find, но КАЖДЫЙ раз, когда я использую его, я не могу на всю жизнь вспомнить метод закрытия опции -exec. Я трачу много времени на чтение каждый раз, когда использую его. Я просто недостаточно использую это или ожидаю от себя слишком многого? Давайте начнем с типичного примера, который расстраивает меня.
В структуре каталогов есть файлы со всеми неверными разрешениями, скрытые файлы, символические ссылки и т. Д. Я хочу сменить владельца на разумное значение
find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;
(Простите, если окончание задом наперед ... Я смотрел на него час назад, и все же я не уверен)
Но я боюсь запускать его из-за монтировок, символических ссылок и т. Д. Я сделал полный удар по chmod. * И заставил его вернуться на меня раньше. Я знаю, что -xdev не будет пересекать разделы, но я не уверен, что случится с файлами, находящимися внутри каталогов, которые являются символическими ссылками.
Так как же овладеть этим зверем, который может убивать важные файлы?
Обновление обрезки лучших предложений ниже и подведение итогов:
- Имейте каталог практики, связанный и смонтированный с другими каталогами практики.
- Используйте xargs вместо неинтуитивной команды exec.
- Используйте -exec echo {} для здравомыслия и безопасности
- Точка с запятой особенная, и вы избегаете ее, поэтому первым должен быть экранирующий символ
- Команда -or может помочь вам объединить критерии выбора.
Я немного растерялся из-за print0, но xargs всегда был немного непростым на первый взгляд практикой, которой я стараюсь избегать.
источник
Ответы:
Ну, что касается
-exec
синтаксиса, вы можете сделать, как многие люди, сдаться и использоватьxargs
:(или версия «файлы с пробелами и прочее», «ерунда в них»)
Или, чтобы попытаться вспомнить , что нужно делать с точкой с запятой, что вам нужно просверлить в голову, что вы используете точку с запятой завершить команду , которая
-exec
запущена, и вы должны бежать на точку с запятой , потому что он имеет специальное смыслbash
. Вот почему это точка с запятой. Кажется, с{}
заменой у тебя все в порядке.Что касается уничтожения файлов и т. Д., Если вы запускаете что-то большое и опасное, о чем вы говорите, сначала сделайте следующее:
и просмотрите результаты. Это в основном «пробный запуск», когда вы видите команды, которые он будет запускать, если вы позволите. Определенно хорошая практика. Не поможет с
.*
проблемой, но вы знаете, не делать это сейчас. :)источник
Я удивлен, что никто еще не упомянул следующую опцию:
Этот синтаксис подтвердит команду перед ее выполнением. Это работает лучше всего, если вы ожидаете, что ваше совпадение будет относительно небольшим количеством файлов, поскольку оно будет запрашивать каждый из них.
В некоторых ответах упоминается
xargs
, но с GNU это тоже не нужно:Обратите внимание, что + обычно не нужно экранировать, но в любом случае полезно привыкнуть к этому.
источник
Это то, для чего нужен человек: бывает сложно запомнить что-то, поэтому команда * nix включает в себя страницы руководства. Вы можете просто всегда проверяйте раздел ACTION страницы человека для напоминания о синтаксисе:
man find
. Хотя справочные страницы могут показаться не очень дружелюбными, но когда вы научитесь читать их, они очень пригодятся.Создайте интерфейс или оболочку. Когда я захотел стать лучше в GNU find, я написал графический интерфейс GUI для find, который генерирует команды find с python, glade и pygtk. Это хорошее упражнение, если вы хотите узнать его очень хорошо.
Есть каталог практики: Наконец, у меня всегда есть каталог «записки» в моей домашней директории для игры с мощными командами, когда что-то вроде «эхо» не обрезает его. Вы можете использовать расширение оболочки, чтобы быстро создать кучу файлов с чем-то вроде:
источник
Вы также можете комбинировать выражения find с операторами «-and» и «-or». -и неявно:
такой же как
Оператор или может сократить ваш список из 4 команд до 2:
И, наконец, не имеет отношения к поиску, но Чоун также может установить группу. Итак, справляясь с пробелами в именах, мы получаем:
источник
При закрытии я просто думаю об использовании; как со многими языками программирования, а затем избежать его. Просто помните, что от него нужно сбежать, и оно приходит к вам довольно легко.
источник
В зависимости от версии find, которую вы используете, могут быть разные варианты. GNU find является, вероятно, самым мощным, и это может помочь вам с вашим вторым (подразумеваемым) вопросом
Например, поведение по умолчанию - не разыменовывать символические ссылки, но вы можете переопределить это; и опция -mount останавливает поиск переходов через точки монтирования
Посмотрите на местных страницах руководства
источник
Некоторые утверждают, что параметр xargs работает быстрее, чем параметр -exec, потому что он не будет выполнять команду один раз для каждого файла, но я не стал бы беспокоиться об этом ни за чем, кроме массовых заданий, занимающих нетривиальное количество времени.
Лично я обычно просто запускаю поиск без exec
убедитесь, что вывод выглядит правильно, а затем запустите мою команду в этом списке.
источник
Для некоторых оболочек (не bash) используйте {} для правильного поведения.
найти руководство хорошо для освоения найти.
источник
Прежде чем делать что-либо подобное, убедитесь, что каталог, в котором вы запускаете эту команду, не находится в той же файловой системе, что и / usr или / etc. (в противном случае, если у меня есть жесткая ссылка на / etc / passwd или на / bin / sh в моем домашнем каталоге, вы только что дали мне право собственности на них, и в качестве побочного эффекта я теперь владею машиной).
Если вы хотите пройти через каталог и разбить все файлы / каталоги, просто
chown -Rh пользователь: пользователь группы /
сделаю это. Убедитесь, что вы используете -h, или chown будет следовать по символическим ссылкам.
источник