Как выбрать / chmod все файлы в текущем каталоге?

56

Я пытаюсь изменить владельца и права доступа к некоторым файлам (и каталогам) в текущем каталоге. Я попробовал это:

chown username:groupname .

... ожидая, что это повлияет на все файлы в текущем каталоге, но повлияет только на каталог, в котором я нахожусь (что противоположно тому, что я хочу сделать). Я хочу изменить его для всех файлов, не затрагивая текущий каталог, в котором я нахожусь.

Как я могу chown и chmod все файлы в текущем каталоге?

Андрей
источник
man chownи man chmodлегко ответить на ваш вопрос.
Ши
2
@ Ши, я думаю, это справедливый вопрос. Чтение этой справочной страницы не поможет. Globbing не является частью chmod. Он встроен в оболочку. Кроме того, чтение документации о глобализации высасывает из вас жизнь (я потратил много времени на изучение всех возможностей zsh).
djf
1
@djf:chown -R user:group .
Ши

Ответы:

96

Вы хотите использовать chown username:groupname *, и позволить оболочке расширить *содержимое текущего каталога. Это изменит разрешения для всех файлов / папок в текущем каталоге, но не для содержимого папок.

Вы также можете сделать это chown -R username:groupname ., что приведет к изменению прав доступа к текущему каталогу, а затем откроется внутри него и всех вложенных папок, чтобы изменить права доступа.

chown -R username:groupname *рекурсивно изменит права доступа ко всем файлам и папкам, оставив текущий каталог в покое. Этот стиль и первый стиль - это то, чем я чаще всего пользуюсь.

Дарт Андроид
источник
2
@ Андрей, но будь настороже, он может быть и другом, и врагом утомленным или неподготовленным.
Дарт Андроид
5
Также остерегайтесь опасностей того периода. Как он расположен прямо рядом с almight "/" на клавиатуре. Простая опечатка может легко превратиться chown -R username:groupname .в chown -R username:groupname /. Создание 2-секундного задания 2-дневного кошмара.
Teynon
@Tom Вот почему я , вероятно , следует начать использовать -vна всех моих рекурсивных команд, но слишком ленив
Колоб Каньон
Только что был назван лучшим и лаконичным ответом, хотя я буду конкретен и назову каталог, просто чтобы избежать скольжения по клавиатуре:chown -R username:groupname directoryname
Дейв Эверитт
9

Я думаю, что вы хотите это:

chown username:groupname *

Если вы также хотите рекурсивно изменять подкаталоги, вам понадобится переключатель -R( -rне рекомендуется):

chown -R username:groupname *

DJF
источник
0

chownотлично, если вы суперпользователь. У меня была проблема, когда кто-то еще работал makeв моем каталоге, и теперь у меня были некоторые файлы, которые я не мог изменить. Вот мой обходной путь, который обрабатывает файлы и каталоги, хотя он оставляет каталоги без суффикса, .mkmeownerесли не может их удалить.

  • Следующий скрипт меняет владельца файлов и каталогов, переданных ему в собственность текущего пользователя, пытаясь обойти проблемы с разрешениями, создавая новую копию каждого каталога или файла, не принадлежащего текущему пользователю, удаляя (или пытаясь удалить) исходный файл и переименование соответственно.
  • Цель состоит в том, чтобы это было сокращение от "сделай меня владельцем". Я не использую подчеркивания, потому что они - боль для печати.

Примеры:

% mkmeowner .

% mkmeowner dirpath1 dirpath2
  • Это требует, чтобы следующий скрипт mkmeowneroneбыл на вашем пути.

mkmeowner:

#!/bin/bash
[ "x$1" == "x-h" ] || [ "x$1" == "x--help" ] && cat << END && exit 0
Usage: $0 dirorfile [direorfile2 ...]:
    change ownership of directories or files to current user.
    Current user must have permissions to read those and write to owner directory.
END
mkmeownerone=`which mkmeownerone`
for d in $*; do
    find "$d" -not -user `whoami` -exec $mkmeownerone {} \;
done

mkmeownerone:

#!/bin/bash
# change ownership of one file or directory
f="$1"
expr match "${f}" '.*\.mkmeowner$' > /dev/null && exit 1 # already tried to do this one
if mv -f "$f" "${f}.mkmeowner"; then
    cp -pr "${f}.mkmeowner" "$f" && rm -rf "${f}.mkmeowner"
    exit 0
fi
exit 1
sbcondor
источник
1
(1) Мы предпочитаем ответы, которые включают некоторые объяснения. Я был удивлен, когда прочитал ваши сценарии и увидел, что они сделали, потому что ваш вступительный абзац не дал мне подсказки. (2) Вы забыли упомянуть, что пользователь должен ввести mkmeowneroneв поиск PATH.  mkmeownerвзорвется, если это не будет сделано. (3) Пожалуйста, узнайте, как (то есть, когда и где) использовать кавычки в командах и сценариях оболочки. Сказать ${f}не полезная альтернатива; см это . … (Продолжение)
Скотт
(Продолжение)… (4) Если вы запустите свой скрипт в каталоге, он потенциально скопирует каждый файл в этом каталоге дважды. (5)  exprустарел. Более эффективно выполнять простое сопоставление строк в оболочке; bash также поддерживает сопоставление регулярных выражений. В этом случае вы можете выполнить проверку имени файла в find. (6). Ваша expr matchкоманда проверяет, ${f}заканчивается mkmeownerли она, а не заканчивается .mkmeowner. Поэтому скрипт не будет работать сам по себе. … (Продолжение)
Скотт
(Продолжение) ... Теперь, возможно, это хорошая вещь - вы не хотите перемещать и потенциально удалять сценарий во время его работы. (Это не обязательно вызовет проблему, но это может быть грязно.) Но вы должны понимать (и документировать) такие особые случаи. (7) Возможно, вы захотите использовать подчеркивания в многословных строках.  dirorfileтрудно читать и понимать (сравнить с dir_or_file), и когда я увидел mkmeowner, моя первая мысль была о кошке ( mk +  meow +  ner).
Скотт
Спасибо за заметки Скотта. 1. Я думал, что у меня есть объяснение, но позвольте мне быть более точным. 2. хороший момент. Я запечатлел это в своем оригинальном сценарии, но достал ссылку. 3. Я пишу сценарии оболочки уже 30 лет, но, конечно, я постараюсь узнать больше. 4. Да, это так. Умышленно, потому что, если у меня нет каталога, я не могу его удалить. Я могу упомянуть это. 5. Да, я старомоден, но expr все еще работает довольно хорошо. 7. Я мог бы, я думаю, я бы получил некоторую художественную лицензию, поскольку подчеркивание не является правилом. Мне нужен сценарий, который делает мяу!
sbcondor
Я не думаю, что с $ {f} что-то не так, верно? Это просто немного дольше, чем необходимо. Я часто использую этот формат, потому что я могу захотеть использовать переменную для создания более длинной строки, например $ {f} .mkmeowner, и мне не нужно помнить, означает ли $ f.heck $ {f} + heck или $ { f.heck}
sbcondor