Як замовити / chmod всі файли в поточному каталозі?


56

Я намагаюся змінити право власності та дозволи деяких файлів (та каталогів) у поточному каталозі. Я спробував це:

chown username:groupname .

... очікуючи, що це вплине на всі файли в поточному каталозі, але натомість вплинуло лише на той каталог, в якому я перебуваю (що протилежне тому, що я хочу зробити). Я хочу змінити його на всіх файлах, не впливаючи на поточний каталог, в якому я перебуваю.

Як я можу подавити та chmod всі файли у поточному каталозі?


man chownі man chmodлегко відповісти на ваше запитання.
Ши

2
@Shi Я думаю, що це справедливе питання. Читання цієї сторінки не допоможе. Глобінг не є частиною chmod. Він вбудований в оболонку. Також читання документації з глобусу висмоктує життя з вас (я витратив багато часу на з'ясування всіх можливостей zsh).
djf

1
@djf:chown -R user:group .
Ши

Відповіді:


96

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

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

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


2
@Andrew Будьте на варті охоронців, він може бути і другом, і ворогом втомленим, або непідготовленим.
Darth Android

5
Також остерігайтеся небезпеки періоду. Оскільки він розміщений прямо поруч із всевишнім "/" на клавіатурі. Простий друк може легко перетворитися chown -R username:groupname .на chown -R username:groupname /. Складання 2-секундної задачі - 2-денний кошмар.
teynon

@ Тому я, мабуть, тому, мабуть, повинен почати використовувати -vвсі мої рекурсивні команди, але занадто ледачий
Колоб Каньйон

Просто визнаний найкращим і найкороткішим прихильником, хоча я би конкретний і назвав каталог, лише щоб уникнути ковзання клавіатури:chown -R username:groupname directoryname
Дейв Еверітт

9

Я думаю, ти хочеш цього:

chown username:groupname *

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

chown -R username:groupname *


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

1
(1) Ми віддаємо перевагу відповідям, які містять деякі пояснення. Мене здивувало, коли я прочитав ваші сценарії та побачив, що вони зробили, бо ваш вступний параграф не дав мені підказки. (2) Ви забули згадати, що користувач повинен ввести mkmeowneroneв пошукову ПАТ.  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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.