Как я могу заставить chown работать рекурсивно?

У меня есть каталог под названием pdfs , который содержит кучу суб- и под-подкаталогов. Я хочу изменить право собственности на все файлы PDF во всех подпапках. Я просто попробовал это:

  chown -R someuser: somegroup * .pdf
 

... но это не изменило права собственности на файлы PDF в подкаталогах. Пользователь и группа существуют.

В соответствии с man-страницей для chown , -R должен означать рекурсивный:

  -R, --recursive
          рекурсивно работать с файлами и каталогами
 

Что мне не хватает?

220 голосов | спросил Nathan Long 22 MarpmTue, 22 Mar 2011 19:29:12 +03002011-03-22T19:29:12+03:0007 2011, 19:29:12

6 ответов


230

Рекурсивный режим работает только в каталогах, а не в файлах. Используя glob '* .pdf', оболочка передает список файлов chown, который видит эти файлы и изменяет разрешения на файлы, которые он видит, и все.

Помните, что в оболочках glob оценивается оболочкой, а не командой. Если glob соответствует файлам, они передаются команде, и команда никогда не знает, что существует glob. (Это отличается от того, как используется командная строка Windows). Если у вас есть каталог, с содержимым что-то вроде:

 : $ ls -F
file1.pdf file2.pdf other.txt subdir /
 

И вы набрали:

  chown -R someuser: somegroup * .pdf
 

Оболочка сначала создаст список: file1.pdf file2.pdf

, а затем запустите команду:

  chown -R someuser: somegroup file1.pdf file2.pdf
 

См., нет никакого каталога для -R, чтобы действовать. Он делает то, что вы просили, - измените право собственности на два файла в командной строке, игнорируя этот причудливый флаг -R.

Чтобы сделать то, что вы хотите, использовать «* .pdf» в качестве шаблона для этого каталога и подкаталогов, вы можете использовать find , который может находить файлы, соответствующие шаблону имени файла (или многим другой критерий) и перейти к подкоманде

  find. -type f -name '* .pdf' | xargs chown someuser: somegroup
 

Это начинается с текущего dir '.' для поиска файлов (filetype f) шаблона имени '*. pdf' , затем переходит к xargs, который строит командную строку для chmod. Обратите внимание на кавычки вокруг шаблона '*. Pdf' , помните, что оболочка будет создавать glob, если это возможно, но вы хотите, чтобы шаблон передавался find , поэтому вам нужно чтобы процитировать его.

Поскольку имена файлов могут содержать пробелы в них, вы хотите использовать трюк, чтобы сделать его безопасным с именами:

  find. -type f -name '* .pdf' -print0 | xargs -0 chown someuser: somegroup
 

В bash 3 и ниже, так вам нужно это сделать. Более мощное globbing доступно в bash 4 (с shopt -s globstar ) и другими оболочками. То же самое в zsh, используя рекурсивный глобус ** :

  chown -R someuser: somegroup ./**/*.pdf
 
ответил Rich Homolka 22 MarpmTue, 22 Mar 2011 19:47:32 +03002011-03-22T19:47:32+03:0007 2011, 19:47:32
28

Это не сложно.

  chown -R someuser: somegroup /your /folder /here /*
 

Это применимо для всех файлов и всех подкаталогов и под-подкаталогов указанной папки. Используйте с осторожностью.

ответил Sprachprofi 9 12015vEurope/Moscow11bEurope/MoscowMon, 09 Nov 2015 14:44:58 +0300 2015, 14:44:58
14

Вы можете использовать утилиту find :

  find. -name '* .pdf' -exec chown someuser: somegroup {} +
 

Пожалуйста, не забывайте котировки вокруг *. pdf . В противном случае оболочка попытается ее расширить. Это означает, что уже оболочка заменит *. Pdf имена всех файлов PDF, найденных в текущем каталоге. Но это не то, что вы хотите. Вы хотите найти файлы PDF, расположенные в подкаталогах. Btw: Это также проблема с вашей командой chown .

ответил bmk 22 MarpmTue, 22 Mar 2011 19:37:41 +03002011-03-22T19:37:41+03:0007 2011, 19:37:41
6

Команда

  chown -R someuser: somegroup * .pdf
 

будет только перезаписывать каталоги, если имя заканчивается на .pdf. Вам нужно что-то вроде:

  find. -name "* .pdf" -exec chown someuser: somegroup {} \;
 
ответил Mike Scott 22 MarpmTue, 22 Mar 2011 19:38:07 +03002011-03-22T19:38:07+03:0007 2011, 19:38:07
0

для изменения права собственности на каталог рекурсивно просто используйте:

  sudo chown -R <имя пользователя>: <groupname> <dir name>
 

here username = новый пользователь, который должен быть владельцем каталога

groupname = новая группа, которая должна быть владельцем каталога

каждый файл /каталог имеет владельца и владельца группы

ответил KawaiKx 11 Mayam16 2016, 04:38:58
0

Вместо этого я использую дерево :

  sudo tree -fai ~ /.blabla | xargs -L1 -I {} sudo chown youruser: youruser {}
 

Также старайтесь не запускать рекурсивные chown или chmod в каталоге «/» или в другой системной директории.

ответил Eduard Florinescu 25 Jpm1000000pmThu, 25 Jan 2018 16:36:51 +030018 2018, 16:36:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132