Рекурсивный режим работает только с каталогами, а не с файлами. С помощью глобуса '* .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
, который может найти файлы, которые соответствуют шаблону имени файла (или много других criterea) и передать подкоманде
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
shopt -s globstar
делает рекурсивное сглаживание.Это применимо к chown для всех файлов и всех подкаталогов и подкаталогов указанной папки. Используйте с осторожностью.
источник
sudo chown -R user ./
сработало для меня, ноsudo chown -R user ./*
не сработало.env
.Вы можете использовать
find
утилиту:Пожалуйста, не забывайте цитаты вокруг
*.pdf
. В противном случае оболочка попытается его расширить. Это означает, что уже оболочка заменит*.pdf
имена всех файлов PDF, найденных в текущем каталоге. Но это не то, что вы хотите. Вы хотите найти файлы PDF, расположенные в подкаталогах. Кстати: это тоже проблема с вашейchown
командой.источник
+
, аккуратный трюк для производительности.-exec command {} +
Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка строится почти так же, как иxargs
ее командные строки. Только один экземпляр{}
допускается в команде. Команда выполняется в начальном каталоге.Команда
будет возвращать каталоги только в том случае, если имя каталога заканчивается на .pdf. Вам нужно что-то вроде:
источник
для рекурсивного изменения владельца каталога просто используйте:
здесь username = новый пользователь, который должен быть владельцем каталога
groupname = новая группа, которая должна быть владельцем каталога
каждый файл / каталог имеет владельца пользователя и владельца группы
источник
Я использую
tree
вместо этого:Также постарайтесь не запускать рекурсивные команды chown или chmod в каталоге '/' или другом системном каталоге.
источник
Чтобы стать владельцем всех файлов в каталоге, используйте
вместо
или же
это может не сработать, если * (слишком много файлов в каталоге) выдано слишком много аргументов, или если не получается то, что вы хотите соответственно.
источник