find 명령의 -exec 옵션에 있는 개별 파일 이름 및 경로

find 명령의 -exec 옵션에 있는 개별 파일 이름 및 경로

탈출하고 평가를 표현하는 작업을 하고 있어요. 파일에서 작동하고 표준 출력으로 출력되는 ... 구조 find내에서 명령을 실행 하려고 합니다 . 명령줄에서 정상적으로 사용 하려면 다음과 같이 새 파일로 리디렉션하면 됩니다.-exec COMMANDCOMMANDCOMMAND

COMMAND inputfilename.md > outputfilename.md.conf

이것은 훌륭하게 작동합니다. 그러나 재귀적으로 반복하고 싶다면모두을 사용하여 디렉터리 및 하위 디렉터리에 있는 파일을 find -exec올바르게 리디렉션할 수 있도록 파일 이름과 경로를 분리하는 방법을 알 수 없는 것 같습니다. 예를 들어 이렇게 하면 오류가 발생합니다.

find ./ *.md -not -path './/.git/*' -exec COMMAND '{} > ~/wiki/newdirectory/{}.cong' \;

{}전체 파일 경로가 확장되기 때문입니다 . 나는 basename다양한 조합을 시도했지만 dirname평가할 수없는 것 같습니다 (대신 "basename"등의 문자열 만 얻습니다). 예를 들어 "basename"이라는 텍스트가 방금 나타나기 때문에 작동하지 않습니다.

find ./ *.md -not -path './/.git/*' -exec COMMAND  '{} > ~/wiki/newdirectory/''basename {}''.conf' \;

(이 오류를 반환합니다: ) 'No such file or directory - .//newdirectory/README.md.conf > ~/wiki/newdirectory/basename .//newdirectory/README.md.conf'.

어떤 도움이라도 대단히 감사하겠습니다. 전체적으로 목표는 다음과 같습니다.

  1. *.md디렉터리에서 일치하는 모든 파일을 반복적으로 반복합니다.
  2. 각 반복마다 동일한 문자열이 실행됩니다 COMMAND inputfile.md > ~/newdirectory/inputfile.md.conf.inputfile

감사해요!

답변1

무엇을 하든 쉘을 호출하여 명령 출력을 파일로 리디렉션해야 하며 파일 위치는 결과에 따라 달라집니다 find.

find ./ *.md -not -path './/.git/*' -exec sh -c 'COMMAND "$0" > ~/wiki/newdirectory/"${0##*/}.cong"' {} \;

{}쉘 스크립트 내에서는 대체를 수행 하지 마십시오 . 모든 시스템이 이 기능을 지원하는 것은 아니며 지원하더라도 일반적으로 파일 이름을 셸 구문의 일부로 처리하므로 작동하지 않습니다. 따라서 예를 들어 file을 호출하면 ;rm -rf ~;.md모든 파일이 삭제됩니다.

${0##*/}파일의 기본 이름을 얻으려면 순수 문자열 조작을 사용하십시오. 을 사용할 수도 있습니다 $(basename -- "$0").

답변2

find동의 하면 -execdir작동합니다 .

find . -name '*.md' -not -path './/.git/*' -execdir COMMAND {} > ~/wiki/newdirectory/{}.cong \;

번갈아

find . -name '*.md' -not -path './/.git/*' -exec bash -c \
'for f; do COMMAND "$f" > ~/wiki/newdirectory/"${f##*/}".cong; done' _ {} +

관련 정보