Когда я подключаю USB-флешку (FAT) к компьютеру Mac или Ubuntu, все файлы имеют установленные исполняемые биты. После копирования структуры каталогов на мой жесткий диск, как я могу рекурсивно удалять исполняемые биты только из файлов и сохранять их в каталогах?
4 ответа
С GNU chmod
(в Ubuntu) вариант с одной командой (начиная с текущего каталога):
chmod -R -x+X .
Объяснение:
-R
- работать рекурсивно-x
- убрать исполняемые флаги для всех пользователей+X
- установить исполняемые флаги для всех пользователей, если это каталог
В этом случае заглавная буква X
применяется только к каталогам, поскольку все исполняемые флаги были очищены с помощью -x
. В противном случае +X
устанавливает исполняемый флаг (ы) также, если флаг был изначально установлен для любого из пользователей, групп или других.
С BSD chmod
(который присутствует в Mac OS X) вы должны сделать это отдельно двумя командами:
sudo chmod -R -x * && sudo chmod -R +X *
(Если вы также хотите включить скрытые файлы в основной каталог, вам, вероятно, нужно изменить * на. (Точка), но это не проверено.)
Если вы сначала перейдете на правильный путь:
find . -type f -exec chmod -x {} \;
или же
chmod -x $(find . -type f)
Поиск находит все файлы типа 'f' (что означает обычный файл) в пути. и затем вызывает chmod -x для каждого файла. {} Подставляется вместо имени файла и \; завершает команду chmod.
Под Linux и Unix в окне терминала или в Mac OS X используйте это в Terminal.app:
find . -type f -print0 | xargs -0 chmod -x
Путь chmod -x+X
у меня тоже не сработал в ubuntu, поэтому я написал этот минимальный скрипт на python:
#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
for d in dirs:
os.chmod(par + '/' + d, 0o755)
for f in files:
os.chmod(par + '/' + f, 0o644)
Если в вашей файловой системе могут быть какие-то дополнительные вещи, такие как сокеты, вы можете захотеть окружить последний chmod командой try/catch.