我试图在 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