Мне назвали каталог pdfs
это содержит набор под - и подподкаталоги. Я хочу изменить владение на всех файлах PDF во всех подпапках. Я просто попробовал это:
chown -R someuser:somegroup *.pdf
... но это не изменило владение PDFs в подкаталогах. Пользователь и группа действительно существуют.
Согласно странице справочника для chown
, -R
должен означать рекурсивный:
-R, --recursive
operate on files and directories recursively
Что я пропускаю?
Рекурсивный режим только работает над каталогами, не файлами. При помощи шарика '*.pdf' оболочка передает список файлов показанному, который видит, что это файлы, и изменяет полномочия на файлах, которые это видит, и вот именно.
Помните в оболочках, шарик оценен оболочкой, не командой. Если шарик соответствует файлам, они передаются команде, и команда никогда не знает, что шарик существовал. (Это отличается, чем, как Windows Command prompt раньше делал вещи). Если у Вас есть dir с содержанием что-то как:
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
Это начинает в текущем dir '.' искать файлы (тип файла f) шаблона имени '*.pdf'
затем передачи в xargs, который создает командную строку к chmod. Заметьте кавычки вокруг шаблона '*.pdf'
, помните, что оболочка создаст шарик, если она может, но Вы хотите шаблон, переданный find
, таким образом, необходимо заключить его в кавычки.
Поскольку имена файлов могут иметь пробелы в них, Вы хотите использовать прием для создания этого именем файла с пробелами безопасный:
find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
В ударе 3 и ниже, это - способ, которым необходимо сделать это. Более мощный globbing доступен в ударе 4 (с shopt -s globstar
) и другие оболочки. То же в zsh, с помощью рекурсивного шарика **
:
chown -R someuser:somegroup ./**/*.pdf
Можно использовать find
утилита:
find . -name '*.pdf' -exec chown someuser:somegroup {} +
Не забывайте кавычки вокруг *.pdf
. Иначе оболочка попытается развернуть его. Это уже означает, что оболочка заменит *.pdf
с названиями всех файлов PDF, найденных в текущем каталоге. Но это не то, что Вы хотите. Вы хотите найти файлы PDF расположенными в подкаталогах. Btw.: Это - также проблема с Вашим chown
команда.
Команда
chown -R someuser:somegroup *.pdf
только рекурсивно вызовет вниз каталоги, если имя каталога закончится в .pdf. Вам нужно что-то как:
find . -name "*.pdf" -exec chown someuser:somegroup {} \;