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