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 {}
должно работать нормально, надеюсь, это поможет вам