根据当前目录中的文件名模式 chown 所有文件

根据当前目录中的文件名模式 chown 所有文件

我正在尝试 chown 所有文件名以ChownFileNames.我使用过这个命令,但它似乎不起作用:

find . -maxdepth 1 |grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;

我究竟做错了什么?

答案1

chown hadoop:hadoop ChownFileNames*

答案2

这应该适合您的需要:

find . -maxdepth 1 -iname 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;

答案3

(“管道”)符号|表示将左侧命令的输出传递给右侧命令。该命令find . -maxdepth 1列出当前目录中的文件(加上.它本身)。该命令grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;没有任何意义:您正在find向该grep命令传递选项。

find本身有一种匹配文件名的方法,即-name谓词。它采用 shell 通配符模式作为参数。

您可以使用grep过滤列表,但您必须提供有效的命令行grep。要仅保留与 shell 模式匹配的文件名ChownFileNames*,您需要使用正则表达式/ChownFileNames[^/]$。然后,您必须解析 的输出,grep以将匹配名称列表转换为命令行参数。假设您运行的是 Linux 并且文件名不包含任何换行符,您可以使用xargs

find . -maxdepth 1 |
grep '/ChownFileNames[^/]*$' |
xargs -d '\n' chown hadoop:hadoop

find使用的动作要简单得多,也更加健壮-exec。请注意,您可以-exec … {} +一次性对一批文件运行该命令,而不是每个文件运行一次。您还可以find列出当前目录。

find . maxdepth 1 \( -name . -o -name 'ChownFileNames*' \) -exec chown hadoop:hadoop {} +

find当您仅按当前目录中的名称(而不是例如按日期)匹配文件(而不遍历子目录)时,运行通常没有意义。除非当前目录中有太多文件导致命令行太长,否则只需使用

chown hadoop:hadoop . ChownFileNames*

答案4

请查看-name-iname中的选项find(1)

相关内容