Эффективное удаление x-bit из файлов в большом каталоге

Эффективное удаление x-bit из файлов в большом каталоге

У меня есть каталог /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 ... {} + -quitmy-command может не быть фактически запущена. Этот вариант -execвсегда возвращает true.

решение2

Используйте xargsдля ограничения нереста:

find /path/to/base/dir -type f -print0 | xargs -0 chmod -x

Связанный контент