탈출하고 평가를 표현하는 작업을 하고 있어요. 파일에서 작동하고 표준 출력으로 출력되는 ... 구조 find
내에서 명령을 실행 하려고 합니다 . 명령줄에서 정상적으로 사용 하려면 다음과 같이 새 파일로 리디렉션하면 됩니다.-exec COMMAND
COMMAND
COMMAND
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'
.
어떤 도움이라도 대단히 감사하겠습니다. 전체적으로 목표는 다음과 같습니다.
*.md
디렉터리에서 일치하는 모든 파일을 반복적으로 반복합니다.- 각 반복마다 동일한 문자열이 실행됩니다
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' _ {} +