Bash 按模式查找和重命名文件适用于Debian,但不适用于CentOS7

Bash 按模式查找和重命名文件适用于Debian,但不适用于CentOS7,bash,find,rename,Bash,Find,Rename,我需要找到和重命名文件与问号的名称。 示例:“style.css?ver=111”应该变成“style.css” 我使用这个命令 find . -type f -name "*\?*" -exec rename 's/\?.*//' '{}' \; 在Debian中,一切都很好,但在CentOS7中,我得到一个错误,即“重命名:参数不够” " 想知道为什么吗?要获得一个在任何POSIX兼容系统中都能工作的可靠选项,您可以使用 find . -type f -name "*\?*" -exec

我需要找到和重命名文件与问号的名称。 示例:“style.css?ver=111”应该变成“style.css”

我使用这个命令

find . -type f -name "*\?*" -exec rename 's/\?.*//' '{}' \;
在Debian中,一切都很好,但在CentOS7中,我得到一个错误,即“重命名:参数不够” "


想知道为什么吗?

要获得一个在任何POSIX兼容系统中都能工作的可靠选项,您可以使用

find . -type f -name "*\?*" -exec sh -c 'mv -- "$1" "${1%%\?*}"' findshell {} \;
$1
是找到的每个文件的名称,
${1%%\?*}
是一个从问号开始剥离子字符串的构造

如果你有几个匹配的文件,那就足够了。如果你需要它,一个更有效的选择是

find . -type f -name "*\?*" -exec sh -c '
    for file in "$@"; do
        mv -- "$file" "${file%%\?*}"
    done
' findshell {} +

查找
不同,
重命名
不是标准工具。为便于携带,选择
mv
。但是,针对您的问题,第一步是找出每台机器上的
重命名版本。CentOS上的
重命名版本似乎是util linux软件包(在Debian上命名)中的版本而不是Perl
rename
脚本。@Freddy完全正确-我如何安装它?@Quasímodo-你能帮助我使用
mv
语法吗-我正在尝试,但没有luckIt似乎在包中(名为
prename
)。效果很好,只要解释一下它是什么,
findshell
:)@AlexeyShatrov
findshell
只是一个任意的名字,它在文件上运行。这没什么大不了的,它实际上更像是一个占位符。在本例中,我假设选择了名称,因为它是在
find
下运行的shell。是的,当find是较大脚本的一部分时,占位符对于错误报告非常有用(因此您知道错误来自何处)。您通常会发现它是
find sh
,它由
sh
分配给
$0