У меня есть каталог /some/dir, содержащий миллионы файлов и каталогов. Мне нужно удалить X-бит для всех файлов, но не из каталогов.
Следующие работы:
find /some/dir -type f -chmod -x {} \;
Но я считаю, что он порождает процесс "chmod" для каждого файла. Это может объяснить, почему он работает так долго.
Есть ли способ сделать это более эффективно?
решение1
Кроме того xargs
, как упомянул Лайм Дуллаарт, вы можете использовать:
find /some/dir -type f -exec chmod -x {} +
В качестве отладочного трюка вы можете просмотреть сгенерированную команду с помощью:
find /some/dir -type f -exec echo chmod -x {} +
Из страницы руководстванайти(1)команда:
-exec command {} +
Этот вариант действия-exec
запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конец; общее количество вызовов команды будет намного меньше количества соответствующих файлов. Командная строка создается примерно так же, как xargs создает свои командные строки. В{}
команде допускается только один экземпляр , и он должен находиться в конце, непосредственно перед+
; его необходимо экранировать (с помощью\
) или заключить в кавычки, чтобы защитить его от интерпретации оболочкой. Команда выполняется в начальном каталоге. Если какой-либо вызов с формой+
возвращает ненулевое значение в качестве статуса выхода, то find возвращает ненулевой статус выхода. Если find обнаруживает ошибку, это иногда может привести к немедленному выходу, поэтому некоторые ожидающие команды могут вообще не быть выполнены. По этой причине-exec my-command ... {} + -quit
my-command может не быть фактически запущена. Этот вариант-exec
всегда возвращает true.
решение2
Используйте xargs
для ограничения нереста:
find /path/to/base/dir -type f -print0 | xargs -0 chmod -x