파이프라인 Sed는 Find "-exec"에서 호출할 때 Bash 명령 대체에서 발견된 파일 이름으로 작동하지 않습니다.

파이프라인 Sed는 Find "-exec"에서 호출할 때 Bash 명령 대체에서 발견된 파일 이름으로 작동하지 않습니다.

어떤 경우에는 "find", "bash" 및 "sed"가 예상대로 작동하지 않는 것 같습니다.

다음 예제에서는 먼저 "sample.txt" 파일을 생성한 다음 파일을 찾아 마지막으로 "-exec" 명령을 통해 처리해야 합니다. 실행된 명령은 발견된 파일 이름, 테스트 샘플 및 수정된 파일 이름을 인쇄합니다. "sed" 명령 자체는 "txt"를 "TXT"로 바꾸는 데 사용됩니다.

touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") \;

예상되는 출력은 다음과 같습니다.

./sample.txt 샘플_이전.TXT ./sample.TXT 샘플_이후.TXT

대신 다음을 생성합니다.

./sample.txt 샘플_이전.TXT ./sample.txt 샘플_이후.TXT

(이 예제는 백틱 "`"을 사용한 구식 명령 대체를 사용하여 테스트되었으며 결과는 동일했습니다.)

내가 뭘 잘못했나요?

답변1

명령 대체는 시작하기 전에도 수행됩니다 find. 실행되는 실제 명령(따옴표 교체, 확장 및 제거 후)은 다음과 같습니다.

find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;

실행해야 하는 경우아무것멋진 (파이핑 또는 여러 명령) -exec그런 다음 별도의 셸을 시작하여 이 작업을 수행합니다.

find . -maxdepth 1 -type f -name '*.txt' \
    -exec sh -c 'printf "%s " "$1"; printf "%s %s %s\n" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'

관련 정보