Как я могу сделать показанную работу рекурсивно?

Мне назвали каталог pdfs это содержит набор под - и подподкаталоги. Я хочу изменить владение на всех файлах PDF во всех подпапках. Я просто попробовал это:

chown -R someuser:somegroup *.pdf

... но это не изменило владение PDFs в подкаталогах. Пользователь и группа действительно существуют.

Согласно странице справочника для chown, -R должен означать рекурсивный:

-R, --recursive
          operate on files and directories recursively

Что я пропускаю?

292
задан 22.03.2011, 18:45

3 ответа

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

Можно использовать find утилита:

find . -name '*.pdf' -exec chown someuser:somegroup {} +

Не забывайте кавычки вокруг *.pdf. Иначе оболочка попытается развернуть его. Это уже означает, что оболочка заменит *.pdf с названиями всех файлов PDF, найденных в текущем каталоге. Но это не то, что Вы хотите. Вы хотите найти файлы PDF расположенными в подкаталогах. Btw.: Это - также проблема с Вашим chown команда.

14
ответ дан 07.12.2019, 07:39

Команда

chown -R someuser:somegroup *.pdf

только рекурсивно вызовет вниз каталоги, если имя каталога закончится в .pdf. Вам нужно что-то как:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;
6
ответ дан 07.12.2019, 07:39

Теги

Похожие вопросы