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


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

chown -R someuser:somegroup *.pdf

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

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

-R, --recursive
          operate on files and directories recursively

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


226
2018-03-22 16:29


происхождения




ответы:


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

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

machine:$ 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

Это начинается в текущем каталоге. ' искать файлы (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

232
2018-03-22 16:47



Отредактировано с учетом того, что bash 4 с shopt -s globstar рекурсивное глотание. - kojiro
@kojiro спасибо! как вы можете сказать, я все еще использую bash3 - Rich Homolka
На странице человека, показанной исходным плакатом, я обнаружил, что chown -R действительно изменил владельца на папки И файлы. Не нужно искать. Использование монетного двора 15. - gwideman
@gwideman Я знаю, что это старое ... Но да, конечно, -R рекурсивно. У ОП просто была проблема с очень специфическим типом рекурсии, расширение и «тип файла - это файл», отфильтрованный один - Rich Homolka
@RichHomolka Ах. OP сказал, что файлы находятся в каталоге под названием «pdfs», поэтому я решил, что проблема заключается в том, как указывать pdf-файлы в качестве каталога для рекурсии и что все содержащиеся в нем файлы являются pdf-файлами, поэтому нет необходимости их выбирать. Но вы вполне можете быть правы, если задание состоит в том, чтобы выбирать только файлы PDF и оставлять других без изменений. - gwideman


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

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

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


29
2017-11-09 11:44



Ясно, что кто-то отвечает на него с 4 лет, но за предупреждение. - Francisco Tapia
Этот вопрос в настоящее время # 1 в Google, поэтому важно отметить правильный ответ. - Sprachprofi
конечно, принятый является более элегантным, читаемым и полным - Francisco Tapia
как-то sudo chown -R user ./ работал на меня, но sudo chown -R user ./* не - Slav
Я знаю, что это старо, но, хотя это отвечает заголовку, не отвечает на вопрос. Это на самом деле немного хуже, чем то, что ОП уже пробовал. - Rich Homolka


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

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

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


14
2018-03-22 16:37



Мне пришлось искать +, аккуратный трюк для производительности. -exec command {} + Этот вариант действия -exec выполняет указанную команду в выбранных файлах, но командная строка создается путем добавления каждого имени выбранного файла в конце; общее количество вызовов команды будет намного меньше количества совпадающих файлов. Командная строка построена почти так же, как xargs строит свои командные строки. Только один экземпляр {} разрешено внутри команды. Команда выполняется в стартовом каталоге. - Patrick M
@PatrickM одно (второстепенное) другое преимущество + vs; .... плюс не является метасимволом оболочки и не должен быть экранирован - Rich Homolka


Команда

chown -R someuser:somegroup *.pdf

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

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

6
2018-03-22 16:38



Технически это будет идти только на один уровень вниз. называете ли вы эту настоящую рекурсию или нет, это упражнение для пользователя :) - Rich Homolka


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

sudo chown -R <username>:<groupname> <dir name>

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

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

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


0
2018-05-11 01:38



Это не делает то, что спросил ОП. Это изменяет права собственности на все, OP запрашивает определенный набор файлов. - Rich Homolka


я использую tree вместо:

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

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


0
2018-01-25 13:36