chown -R исключить какой-либо каталог
Я хочу исключить большой каталог содержимого
Я использую это, чтобы chown Directory
chown -R admin /home/admin/web/public_html
в любом случае, чтобы исключить подкаталог под HTML
Подобно:
chown -R admin exclude=/home/admin/web/public_html/content /home/admin/web/public_html
Что-то вроде того
Спасибо
7 ответов
chown -R admin $(ls -I content)
ls -I
выведет список всех, кроме указанного шаблона.
В Linux наиболее универсальным инструментом, позволяющим что-то сделать с файлами, отвечающими некоторым критериям, является . Несколько других ответов основаны наfind … | xargs …
идея, которая надежна только в том случае, если она использует строки с нулевым завершением. Это означаетfind … -print0 | xargs -0 …
, но эти параметры не требуются POSIX.
В POSIX обычно лучше использовать, чем передавать по конвейеру. Лично я предпочитаю, даже если я могу безопасно использовать . Зная, что это тоже тест, поэтому его можно использовать для создания пользовательских тестов ( пример ), в любом случае полезно с ним ознакомиться; и тогда нет причин не использовать его вместо . Настоящая сила — это способность анализировать строки с кавычками и экранированными символами; но это вряд ли когда-нибудь пригодится при чтении из , почти всегда вредно. Не POSIX-опции, такие как-0
и--no-run-if-empty
могу сделатьxargs
хороший компаньонfind … -print0
, но тем не менее хороший POSIX (почти?) всегда как минимум не хуже.
Вашу проблему можно решить
find /home/admin/web/public_html \
-path /home/admin/web/public_html/content -prune \
-o -exec chown admin {} +
Это работает следующим образом: если путь…/content
тогда не спускайтесь в него(-prune
); в противном случае (-o
) выполнятьchown admin
в файле (примечание: каталог также является файлом ).
Примечания:
Не используйте здесь. Первый проверенный файл: и если вы используете
chown -R
по этому тогда ничего не будет исключено.-exec chown … {} +
может и будет передавать несколько путей к , в то время как-exec chown … {} \;
пройдет только один (так что на каждый файл будет создано по одному). Синтаксис с уменьшает количество порождаемых процессов, это ускоряет работу. Даже в этом случае будет запущено более одного процесса, если количество файлов слишком велико для одной командной строки (сравните « слишком длинный список аргументов »). Обратите внимание, что это работает, потому чтоchown
может идти несколькими путями; некоторые инструменты не могут, и для них синтаксис с+
исключено.совпадения по всему пути. Путь - это то, что
find
думает, что это не обязательно канонический путь. Если начальный путь равен, то каждый проверенный путь будет начинаться с этой строки; но если начальный путь./
тогда каждый проверенный путь будет начинаться с этой строки. В первом случае-path /home/admin/web/public_html/content
никогда не будет правдой, даже еслиrealpath ./
принты/home/admin/web/public_html
, поскольку соответствующий каталог будет идентифицирован строкой./content
и это строка, с которой вы хотите сопоставить. В общем, вам нужно скорректировать аргумент-path
в начальное местоположение (или, возможно, используйте подстановочные знаки ).Если вам нужно исключить несколько шаблонов, следуйте этому примеру:
find . \ -path ./content -prune \ -o -path ./foo/bar -prune \ -o -path '*/baz' -prune \ -o -exec chown admin {} +
который можно сжать до
find . \ \( -path ./content \ -o -path ./foo/bar \ -o -path '*/baz' \ \) -prune \ -o -exec chown admin {} +
где скобки важны .
С
-regex
возможно, вам удастся объединить несколько шаблонов в один ( пример ). Однако POSIX не требует этого теста.Другие тесты (например,
-name
или даже-exec
) можно использовать для исключения файлов.
Вы можете исключить каталоги, используя!(enumeration_of_directories)
обозначения. Пример удаления носителя и журналов изchown
chown -R myuser:mygroup /www/myapp/!(media|logs)
find . -type d -not -path /home/admin/web/public_html -prune -o -print0 | xargs -0 chown admin
куда -type d
фильтр по каталогу и -not -path /home/admin/web/public_html
исключить каталог.
Несколько нестандартный подход:firejail
.
Firejail — это программа SUID, которая снижает риск нарушений безопасности, ограничивая среду выполнения ненадежных приложений с использованием пространств имен Linux и seccomp-bpf. Это позволяет процессу и всем его потомкам иметь собственное представление о глобально разделяемых ресурсах ядра, таких как сетевой стек, таблица процессов, таблица монтирования.
firejail --noprofile --quiet --blacklist=/home/admin/web/public_html/content chown -R admin /home/admin/web/public_html
Это довольно удобный универсальный способ защитить некоторые файлы. В этом случае, если/home/admin/web/public_html/content
является каталогом, то вместо этого он увидит пустой «каталог самозванца». Инструмент сможет воздействовать на него, поэтому ошибок не будет. Реальный каталог останется неизменным.
Есть причуда: если есть и вы вносите в черный список/bin/chown
или/bin
затемchown
не побежит. В таком случае рассмотрим--read-only
вместо--blacklist
. Видетьman 1 firejail
для получения подробной информации.
Отsudo firejail … chown …
иfirejail … sudo chown …
Я бы предпочел последнее.
для chown -R исключить подкаталог, но не родительский каталог самостоятельно
например:
find . -mindepth 1 -maxdepth 1 \( -path ./node_modules \) -prune -o -print0 |xargs -0 chown -R www-data:www-data
исключать . и подкаталоги и файлы chown исключают папку «node_modules».
От /home/admin/web/public_html
find . ! -name "content" | xargs -I {} chown admin {}
должно работать нормально, надеюсь, это поможет вам