У меня есть почти 800 файлов в каталоге, который является /storage/ . И там есть 800 .dat файлов, которые сейчас имеют разрешение -rw-rw-r-- . Я хочу перевести все эти файлы в режим только для чтения. Я попробовал это:

find /storage/ -name "*.dat" | xargs chmod 444

на локальной машине, и она работает нормально для 10 или 20 файлов. Но когда я ssh на свой сервер и выполнить ту же команду для этих 800 файлов, это заняло 20 минут, и команда все еще выполняется.

Есть ли конкретный и быстрый способ сделать это? Все мои файлы находятся не на локальной машине, а на размещенном сервере.

Эти 800 файлов по 30 Гб каждый.

2 ответа2

0

Вы должны отладить проблему. Создать сценарий с

echo '#!/bin/sh' > bigscript.sh
find /storage/ -name "*.dat" | xargs -n 1 echo chmod 444 >> bigscript.sh
chmod u+x bigscript.sh

Затем отредактируйте bigscript и добавьте в некоторые строки отладочную информацию (echo A , echo B , ...) и найдите ошибки.

Размер файлов не имеет значения; 800 файлов занимают немного времени.

альтернативы

Простая альтернатива: попробуйте chmod -v ; это говорит вам, что делает chmod.

Другой вариант: найдите PID запущенного chmod (-> CHMODPID) и посмотрите на ls -l /proc/$CHMODPID/fd

0

Ключевой разницей может быть время поиска по гораздо большему объему /storage . Пусть эта папка на сервере содержит очень большое количество любого рода файлы , которые увеличивают продолжительность требуемой , чтобы найти все dat файлов в это дерево. Серверная часть /storage может быть слишком медленным.

Следующая команда может дать вам представление об этом (подсчитывает количество файлов и папок в /storage):

find /storage | wc -l

Также обратите внимание, что команда, которую вы запускаете, будет искать все файлы *.dat в качестве первого шага, а затем вызывать chmod только один раз со всеми соответствующими именами в качестве второго шага.

Вызывать chmod с 20 аргументами имени файла разумно, но 800 аргументов пути к файлу становится слишком много. Ваша система имеет ограничения по длине аргумента командной строки (см. xargs --show-limits).

Я бы предложил вам напрямую попросить find выполнить вашу команду, которая будет разбивать вызовы chmod на несколько подмножеств. Следующая команда будет вызывать chmod один раз для каждой папки, содержащей файлы dat , что представляется разумным:

find /storage -type f -name '*.dat' -execdir chmod 444 '{}' \+
  • Для разветвления одного chmod на соответствующий файл необходимо заменить \+ на \;
  • Чтобы иметь лучшее представление о прогрессии, вы можете добавить аргумент --changes или --verbose в вызов chmod .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .