如何chown / chmod当前目录中的所有文件?


56

我正在尝试更改当前目录中某些文件(和目录)的所有权和权限。我尝试了这个:

chown username:groupname .

...预计这会影响当前目录中的所有文件,但只会影响我所在的目录(这与我要执行的操作相反)。我想在所有文件上更改它,而不影响我所在的当前目录。

我如何chown和chmod当前目录中的所有文件?


man chownman chmod容易回答你的问题。

2
@Shi我认为这是一个公平的问题。阅读该手册页无济于事。乱七八糟不是其中的一部分chmod。它内置在外壳中。另请阅读有关通配符的文档,这会使您心烦意乱(我花了很多时间弄清楚zsh的所有功能)。
djf 2012年

1
@djf:chown -R user:group .

Answers:


96

您要使用chown username:groupname *,然后让shell将扩展*到当前目录的内容。这将更改当前目录中所有文件/文件夹的权限,但不会更改文件夹的内容。

您也可以这样做chown -R username:groupname .,这将更改当前目录的权限,然后向下递归其内部以及所有子文件夹以更改权限。

chown -R username:groupname *将递归地更改所有文件和文件夹的权限,而将当前目录本身保留下来。这种风格和第一种风格是我发现自己最经常使用的风格。


2
@安德鲁(Andrew)保持警惕,他既可以成为敌人,也可以成为疲倦的敌人,也可以毫无准备。
达斯Android

5
另外,请注意这段时期的危险。由于它被放置在键盘上全能的“ /”旁边。一个简单的错字很容易chown -R username:groupname .变成chown -R username:groupname /。使2秒的任务成为2天的噩梦。
teynon

@Tom这就是为什么我应该开始-v在所有递归命令上使用的原因,但是太懒了
Kolob Canyon

只是被提名为最佳和最简洁的答案,尽管我会具体说明并命名目录,以避免键盘滑动:chown -R username:groupname directoryname
Dave Everitt,

9

我想你想要这个:

chown username:groupname *

如果您还想递归地更改子目录,则需要使用-R-r已弃用)开关:

chown -R username:groupname *


0

chown如果您是超级用户,那就太好了。我遇到了一个问题,那就是其他人已经make在我的目录中运行了,现在拥有一些我无法修改的文件。这是我处理文件和目录的解决方法,尽管.mkmeowner如果无法删除它们,则会使目录带有后缀。

  • 以下脚本将传递给它的文件和目录的所有权更改为当前用户拥有,尝试通过为当前用户不拥有的每个目录或文件创建新副本来解决权限问题,删除(或尝试删除)原始文件,并进行适当的重命名。
  • 目的是使它成为“ make me owner”的缩写。我不使用下划线,因为它们很难打。

例子:

% 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)请学习如何(即何时何地)在Shell命令和脚本中使用引号。说${f}不是一个有用的选择。看到这个。…(续)
斯科特

(续)…(4)如果您在某个目录上运行脚本,则该脚本可能会将该目录中的每个文件复制两次。(5)  expr陈旧。在shell中执行简单的字符串匹配会更有效;bash还支持正则表达式匹配。为此,您可以在find. (6)中执行文件名测试,您的expr match命令测试是否${f}以结尾mkmeowner,而不是以结尾.mkmeowner。因此,该脚本将无法自行运行。…(续)
斯科特

(续)…现在,可以说这是一件好事–您不想移动并可能在脚本运行时删除该脚本。(不一定会引起问题,但可能会很麻烦。)但是您应该了解(并记录)类似的特殊情况。(7)您可能要在多字字符串中使用下划线。  dirorfile很难阅读和理解(与相比dir_or_file),当我看到时mkmeowner,我的第一个念头是猫(mk +  meow +  ner)。
斯科特

谢谢你的笔记斯科特。我以为我有一个解释,但请让我更明确。2.好点。我已经在原始脚本中捕获了该内容,但删除了参考。3.我已经写了30年的Shell脚本,但是可以肯定的是,我会尝试学习更多。4.是的。故意这样做是因为,如果我不拥有该目录,就无法删除它。我可以提一下。5.是的,我过时了,但是expr仍然可以很好地工作6.很好。7.我想我可能会获得一些艺术许可,因为下划线不是规则。我需要一个让喵喵叫的脚本!
sbcondor

我认为$ {f}没什么问题,对吧?它只比必要的时间长一点。这种格式是我经常使用的格式,因为我可能想使用变量来生成更长的字符串,例如$ {f} .mkmeowner,而不必记住$ f.heck是指$ {f} + heck还是$ { f.heck}
sbcondor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.