在linux中使用xargs和chmod命令更改目录和子目录的权限

发布于 2025-01-09 11:13:14 字数 732 浏览 0 评论 0原文

我在当前目录中有一个目录列表,以权限代码命名(例如:552、700、777)。我想从目录名称获取代码权限并将其应用于该目录及其包含的所有文件。

我尝试使用 xargs 命令: <代码>查找 . -名称“[0-9][0-9][0-9]”-type d | xargs chmod -R [0-9][0-9][0-9]

此命令的问题是它采用第一个目录并更改所有目录的权限代码。

├── 555
│   └── logs
│       ├── 01.log
│       ├── 02.log
│       ├── 03.log
│       ├── 04.log
│       ├── 05.log
│       ├── 06.log
│       └── 07.log
├── 700
│   └── data
│       └── data1.data

我想要什么:我有 555 目录,所以我想用权限代码 555 更改所有子文件和目录,对于第二个目录,我想用权限代码 700 更改所有子文件和目录

我的命令做什么:它更改所有第一个文件的权限代码为500的其他文件和子目录

i have a list of directories in the current directory named with there permission codes (exemple : 552, 700, 777). I want to get the code permission from the name of directory and apply it to the directory and all the files it contains.

I tried with the xargs command :
find . -name "[0-9][0-9][0-9]" -type d | xargs chmod -R [0-9][0-9][0-9]

the problem with this command it takes the first directory and its change the permission code of all directories.

├── 555
│   └── logs
│       ├── 01.log
│       ├── 02.log
│       ├── 03.log
│       ├── 04.log
│       ├── 05.log
│       ├── 06.log
│       └── 07.log
├── 700
│   └── data
│       └── data1.data

what I want : I have the 555 directory so I want to change all sub files and directory with permission code 555 and for the second directory I want to change all the subfiles and directory with the permission code 700

what my command do: it change all other files and subdirectories with the permission code of the first file 500

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

咆哮 2025-01-16 11:13:14

尝试一下

find . -name "[0-9][0-9][0-9]" -type d  | sed 's#\./\(.*\)#\1#' | xargs -I{} chmod -R {} {}
  • find 与您的相同。
  • 添加 sed 是为了从目录名称中删除 ./。 Find 返回 ./700./555、...
  • xargs-I 使用 { } 以重用它在命令中接收到的内容。所以它显示“chmod -R DIRNAME DIRNAME”。所以chmod -R 700 700等等。
  • 在您的尝试中,xargs chmod -R [0-9][0-9][0-9]find 到 xargs 中的 [0-9]。

Try

find . -name "[0-9][0-9][0-9]" -type d  | sed 's#\./\(.*\)#\1#' | xargs -I{} chmod -R {} {}
  • the find is the same as yours.
  • the sed is added to remove the ./ from the directory name. Find returns ./700, ./555, ...
  • xargs with -I uses {} to reuse what it received into the command. So it says "chmod -R DIRNAME DIRNAME". So chmod -R 700 700 and so on.
  • In your attempt, xargs chmod -R [0-9][0-9][0-9], there is nothing to link the [0-9] in the find to the [0-9] in xargs.
成熟的代价 2025-01-16 11:13:14

没有 xargs

find . -type d -regextype sed -regex ".*/[0-9]\{3\}$"| awk -F"/" '{print "chmod -R " $NF,$0}'|sh

Without xargs

find . -type d -regextype sed -regex ".*/[0-9]\{3\}
quot;| awk -F"/" '{print "chmod -R " $NF,$0}'|sh
对你而言 2025-01-16 11:13:14

查找:

find . -type d -name '[0-7][0-7][0-7]' \
-exec sh -c 'for i do chmod -R "${i##*/}" "$i"; done' _ {} +

或 bash 循环:

shopt -s globstar

for i in **/[0-7][0-7][0-7]/; do
    i=${i%/}
    chmod -R "${i##*/}" "$i"; done
done

find:

find . -type d -name '[0-7][0-7][0-7]' \
-exec sh -c 'for i do chmod -R "${i##*/}" "$i"; done' _ {} +

or a bash loop:

shopt -s globstar

for i in **/[0-7][0-7][0-7]/; do
    i=${i%/}
    chmod -R "${i##*/}" "$i"; done
done
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文