require_once
PHP 파일에서 제거 하는 명령을 실행하려고 합니다.여기(아래 코드) 그러나 오류가 발생합니다.
sed: 읽을 수 없습니다. -: 해당 파일이나 디렉터리가 없습니다.
올바른 폴더에 있습니다. 무엇이 문제입니까?
find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
-not -wholename '*/Application.php' -print0 | \
xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'
고쳐 쓰다:
내가 실행하면 :
find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
-not -wholename '*/Application.php' -print0
나는 얻다:
찾기: 잘못된 술어 "-wholename"
나는 이것을 시도했고 모든 파일 목록을 반환했습니다.
find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
-not -name '*/Application.php' -print0
그러나 이를 반영하도록 원본 콘텐츠를 변경합니다.
find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
-not -name '*/Application.php' -print0 | \ xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'
오류가 발생합니다.
-bash: xargs: 명령을 찾을 수 없음
참고로 저는 sed 버전 4.1.2를 실행 중이고 명령줄에서 약간 길을 잃었으므로 답을 설명해 주세요.
답변1
오류는 sed가 읽기를 시도하고 있음을 나타내는 것 같습니다.표준 입력. 시도해 봤어?찾다섹션에서 파일이 반환되는지 확인하시겠습니까?
답변2
두 번째 호출은 의미가 없습니다. xarsg 앞에 "\"가 있는 이유는 무엇입니까? "xargs"라는 프로그램을 호출하려고 하는데 bash가 프로그램을 찾을 수 없다고 말하는 것은 놀라운 일이 아닙니다(콜론 뒤의 이중 공백에 주의하십시오).
xargs가 0개의 파일을 반환할 때(명령줄 인수가 없을 때 stdin에서 읽기를 시도하기 때문에) sed가 중단되는 오류 조건을 제거하려면 xargs 인수에 -r을 추가해야 합니다.
답변3
sed
어떤 버전이 있나요? POSIX sed는 이중 대시 옵션을 이해하지 못하고 축소하지도 않지만 GNU sed는 이해합니다.
좀 더 이식성이 뛰어난(제 생각에는 더 나은) 것을 원하시면 sed -i '/require_once/s![[:space:]]*!&// !'
.
답변4
아쉽게도 질문에 링크된 페이지가 사라져서 원래 명령어를 확인할 수 없습니다. 대신에 몇 가지 추측을 해보겠습니다.
첫 번째 오류는 GNU를 실행 sed
하고 .txt라는 입력 파일을 내부 편집할 때 발생합니다 -
. 파일이 존재하지 않으며 다음 오류가 발생합니다.
예(빈 sed
스크립트 사용):
$ sed -i -e '' -
sed: can't read -: No such file or directory
파일 이름이 어디서 왔는지는 모르지만 -
파일 이름을 가져오지 못하는 것과 관련이 있을 수 있습니다 find
(아래 참조).
이제 명령이 더 이상 테스트를 인식하지 못 find
하므로 다른 시스템이나 구현 으로 전환한 것으로 보입니다 . 이 오류는 나를 혼란스럽게 합니다.find
-wholename
-wholename
그런 다음 으로 변경 하되 GNU 와 동일 -name
하게 변경해야 합니다 .-path
-wholename
-path
find
으로 변경하더라도 find
사용 중인 표현식이 정규 표현식이어야 하므로 명령이 여전히 작동하지 않습니다.-wholename
-path
정규 표현식으로서 */Application.php
정확한 문자열과 일치합니다 */Application.php
. *
정규식 시작 부분의 A는 리터럴과 일치합니다 *
. 를 사용하려고 했을 수도 있지만 .*/Application.php
이는 와 동일합니다 -name "Application.php"
.
위의 모든 사항을 고려하여 xargs
호출을 제거합니다(저것명령 이름 앞의 공백을 이스케이프하면 오류가 발생합니다. 이 공백은 실제 명령 이름의 일부가 되어 찾을 수 없습니다.
find . -type f -name '*.php' \
! -path '.*/Loader/Autoloader.php' \
! -name 'Application.php' \
-exec sed -i 's/require_once/\/\/ &/' {} +
또한 GNU 호출이 약간 줄어들므로 sed
확장 정규식을 사용할 필요가 없습니다.
관련된: