<source_model>.*</source_model>
다음 위치에 있는 모든 파일을 찾고 있습니다 ./vendor/magento/*/etc/adminhtml/system.xml
.
find ./vendor/magento/ -type f -path */etc/adminhtml/system.xml -exec grep -P "<source_model>.*</source_model>" {} +
그러나 출력은 다음과 같은 형식입니다.
./vendor/magento/module-authorizenet-cardinal/etc/adminhtml/system.xml: <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
값을 추출하고 싶습니다.
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<source_model>Magento\Captcha\Model\Config\Mode</source_model>
...
이렇게 하면 정리할 수 있어요. 어떻게 해야 하나요?
답변1
검색할 파일이 여러 개 주어지면 기본 동작은 grep
출력의 각 줄에 파일 이름을 추가하는 것입니다. 따라서 이 출력이 표시되는 이유는 각 파일에 대해 개별적으로 명령을 실행하는 -exec ... +
대신 파일을 그룹화하여 가능한 한 적은 수의 인스턴스를 시작하려고 시도하는 명령을 사용하고 있기 때문입니다 . -exec ... \;
따라서 몇 가지 옵션이 있습니다(값 주위의 따옴표에 주의하십시오 -path
. 그렇지 않으면 *
쉘이 값을 보기 전에 확장할 것입니다 find
).
사용
-exec \;
find ./vendor/magento/ -type f -path '*/etc/adminhtml/system.xml' \ -exec grep -P "<source_model>.*</source_model>" {} \;
grep
GNU( Linux 시스템의 기본값) 를 사용하는 경우 이-h
플래그를 사용하여 파일 이름 인쇄를 억제하도록 지시 할 수 있습니다.find ./vendor/magento/ -type f -path '*/etc/adminhtml/system.xml' \ -exec grep -hP "<source_model>.*</source_model>" {} +
물론, 이 모든 것을 지원하는 구현을 사용하는 경우 해당 플래그 grep
도 필요할 수 있으므로 행에서 일치하는 부분만 인쇄됩니다.-o
grep