van*_*van 7 shell scripting bash find filenames
我正在尝试 chown 所有文件名以ChownFileNames. 我用过这个命令,但它似乎不起作用:
find . -maxdepth 1 |grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
这应该适用于您的需要:
find . -maxdepth 1 -iname 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
Run Code Online (Sandbox Code Playgroud)
( |\xe2\x80\x9cpipe\xe2\x80\x9d) 符号的意思是将左侧命令的输出传递给右侧命令。该命令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 |\ngrep '/ChownFileNames[^/]*$' |\nxargs -d '\\n' chown hadoop:hadoop\nRun Code Online (Sandbox Code Playgroud)\n\nfind使用的动作要简单得多,也更加健壮-exec。请注意,您可以-exec \xe2\x80\xa6 {} +一次性对一批文件运行该命令,而不是每个文件运行一次。您还可以列出find当前目录。
find . maxdepth 1 \\( -name . -o -name 'ChownFileNames*' \\) -exec chown hadoop:hadoop {} +\nRun Code Online (Sandbox Code Playgroud)\n\nfind当您仅按当前目录中的名称(而不是例如按日期)匹配文件(而不遍历子目录)时,运行通常没有意义。除非当前目录中有太多文件导致命令行太长,否则只需使用
chown hadoop:hadoop . ChownFileNames*\nRun Code Online (Sandbox Code Playgroud)\n