我正在尝试 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)