255

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

chown -R someuser:somegroup *.pdf

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

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

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

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

7 ответов7

262

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

Помните, что в оболочках глобб оценивается оболочкой, а не командой. Если глобус соответствует файлам, они передаются команде, и команда никогда не узнает, что глобус существует. (Это отличается от того, как командная строка 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

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

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

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

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

14

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

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

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

6

Команда

chown -R someuser:somegroup *.pdf

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

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

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

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

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

0

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

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

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

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

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

0

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

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

вместо

sudo chown $USER directory\*

или же

sudo chown --recursive $USER directory

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .