Режим рекурсивности работает только на каталогах, но не на файлах. С помощью глобуса ‘*.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
```.