通配符查找替换 CP

通配符查找替换 CP

我试图在 CentOS 上替换与特定模式*匹配的文件,但它不起作用。

我最初写道:

cp example.com/(*)/orm-mysql/build/conf/(*)-conf.live.php example_dev.com/$1/orm-mysql/build/conf/$1-conf.live.php

我想将example_dev.com目录中的文件替换为.txt中的同名文件example.com

*该模式可以是example.com/任何内容,直到/orm-mysql/build/conf/文件以第一个通配符值为前缀并以-conf.live.php.

我尝试find使用exec

find /var/www/html/example.com -name '*/orm-mysql/build/conf/*-conf.live.php' -exec echo {} \;

但它引发了一个错误:

find: 警告:Unix 文件名通常不包含斜杠(尽管路径名包含斜杠)。这意味着 '-name '*/orm-mysql/build/conf/*-conf.live.php'' 在此系统上可能始终评估为 false。您可能会发现“-wholename”测试更有用,或者“-samefile”测试可能更有用。或者,如果您使用 GNU grep,则可以使用 'find ... -print0 | grep -FzZ '*/orm-mysql/build/conf/*-conf.live.php''

我认为这是因为-name是文件,而不是路径。

我怎样才能做到这一点,有没有比编写 shell 脚本更简单的方法?

一些例子:

/var/www/html/example.com/video/orm-mysql/build/conf/video-conf.live.php
/var/www/html/example.com/images/orm-mysql/build/conf/images-conf.live.php
/var/www/html/example.com/audio/orm-mysql/build/conf/audio-conf.live.php

他们将取代:

/var/www/html/example_dev.com/video/orm-mysql/build/conf/video-conf.live.php
/var/www/html/example_dev.com/images/orm-mysql/build/conf/images-conf.live.php
/var/www/html/example_dev.com/audio/orm-mysql/build/conf/audio-conf.live.php

答案1

我实际上会用 shell 循环来做到这一点:

for dir in example.com/*; do
    prefix=${dir##*/}
    cp "$dir"/orm-mysql/build/conf/"$prefix"-conf.live.php \
        example_dev.com/"$prefix"/orm-mysql/build/conf/$1-conf.live.php
done

如果目标目录不存在,则会报错,但如果目标目录存在,则会按预期工作。如果您想避免投诉,请使用以下方法:

for dir in example.com/*; do
    prefix=${dir##*/}
    target=example_dev.com/"$prefix"/orm-mysql/build/conf/
    if [ -d "$target" ]; then
        cp "$dir"/orm-mysql/build/conf/"$prefix"-conf.live.php "$target"
    fi
done

相关内容