Рекурсивний режим працює лише в каталогах, а не в файлах. Використовуючи глобул '* .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 і нижче це саме те, що вам потрібно зробити. Більш потужний глобус доступний в баш-4 (з shopt -s globstar
) та інших оболонках. Те ж саме в zsh, використовуючи рекурсивний глобул **
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
рекурсивним глобалізацією.