와일드카드 검색 및 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경로가 아니라 파일 때문인 것 같아요 .

어떻게 해야 합니까? 쉘 스크립트를 작성하는 것보다 더 쉬운 방법이 있습니까?

몇 가지 예:

/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

실제로 이 작업을 수행하려면 쉘 루프를 사용합니다.

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

관련 정보