Как я могу заставить чоун работать рекурсивно?
У меня есть каталог под названием pdfs
который содержит кучу под- и под-подкаталогов. Я хочу изменить владельца всех файлов PDF во всех подпапках. Я только что попробовал это:
chown -R someuser:somegroup *.pdf
... но это не изменило владение PDF-файлами в подкаталогах. Пользователь и группа существуют.
Согласно справочной странице для chown
, -R
должно означать рекурсивный:
-R, --recursive
operate on files and directories recursively
Что мне не хватает?
7 ответов
Рекурсивный режим работает только с каталогами, а не с файлами. Используя глобус '*.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
chown -R someuser:somegroup /your/folder/here/*
Это применимо к chown для всех файлов и всех подкаталогов и подкаталогов указанной папки. Используйте с осторожностью.
Вы можете использовать find
полезность:
find . -name '*.pdf' -exec chown someuser:somegroup {} +
Пожалуйста, не забывайте цитаты вокруг *.pdf
, В противном случае оболочка попытается его расширить. Это значит уже оболочка заменит *.pdf
с именами всех файлов PDF, найденных в текущем каталоге. Но это не то, что вы хотите. Вы хотите найти файлы PDF, расположенные в подкаталогах. Кстати: это также проблема с вашим chown
команда.
Команда
chown -R someuser:somegroup *.pdf
будет возвращать каталоги только в том случае, если имя каталога заканчивается на.pdf. Вам нужно что-то вроде:
find . -name "*.pdf" -exec chown someuser:somegroup {} \;
Для рекурсивного изменения владельца каталога просто используйте:
sudo chown -R <username>:<groupname> <dir name>
здесь username = новый пользователь, который должен быть владельцем каталога
groupname = новая группа, которая должна быть владельцем каталога
каждый файл / каталог имеет владельца пользователя и владельца группы
Чтобы стать владельцем всех файлов в каталоге, используйте
find directory -type f -name '*' | sudo xargs -d '\n' chown $USER
вместо
sudo chown $USER directory\*
или же
sudo chown --recursive $USER directory
это может не сработать, если * (слишком много файлов в каталоге) выдано слишком много аргументов, или если не получается то, что вы хотите соответственно.
Я использую tree
вместо:
sudo tree -fai ~/.blabla | xargs -L1 -I{} sudo chown youruser:youruser {}
Также постарайтесь не запускать рекурсивные команды chown или chmod в каталоге '/' или другом системном каталоге.