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 {}

должно работать нормально, надеюсь, это поможет вам

Другие вопросы по тегам