2011-03-22 16:29:12 +0000 2011-03-22 16:29:12 +0000
308
308

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

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

chown -R someuser:somegroup *.pdf

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

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

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

Что я пропустил?

Ответы (7)

315
315
315
2011-03-22 16:47:32 +0000

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

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

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

И вы набрали:

chown -R someuser:somegroup *.pdf

Оболочка сначала сделает list: file1.pdf file2.pdf

, а затем выполнит вашу команду:

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

See, there’s no directory for -R to act on. Он делает то, что вы просили - меняет права собственности на два файла в командной строке, игнорируя этот причудливый флаг -R.

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

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

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

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

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

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

chown -R someuser:somegroup ./**/*.pdf
```.
57
57
57
2015-11-09 11:44:58 +0000
chown -R someuser:somegroup /your/folder/here/*

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

14
14
14
2011-03-22 16:37:41 +0000

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

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

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

6
6
6
2011-03-22 16:38:07 +0000

Команда

chown -R someuser:somegroup *.pdf

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

find . -name "*.pdf" -exec chown someuser:somegroup {} \;
1
1
1
2016-05-11 01:38:58 +0000

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

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

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

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

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

0
0
0
2018-01-25 13:36:51 +0000

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

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

Также позаботьтесь о том, чтобы не запускать рекурсивное chown или chmod в каталоге ‘/’ или другом системном каталоге.

0
0
0
2019-01-29 20:22:33 +0000

Чтобы стать владельцем всех файлов в каталоге, используйте

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

вместо

или

sudo chown $USER directory\*

, которые могут не сработать, если слишком много аргументов * (слишком много файлов в каталоге) или которые не делают то, что вы хотите соответственно.

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

10
8
37
7
7