xargs
아래에 명령 내부에 전달된 매개변수를 사용하여 명령 에 전달해야 하는 몇 가지 명령이 있는데 echo
올바르게 이해할 수 없는 것 같습니까? 내가 시도하면 :
find . -maxdepth 1 -type f -wholename "$1" | xargs -I{} echo -e "<h2>Filename: {}</h2>\n<pre> `cat *`\n</pre>\n<br>
Word Count $(wc -w {})";
보시다시피 wc -w {}
내 명령에서는 작동하지 않으며 xargs
이를 리터럴로 처리합니다. 내가 시도하면 :
find . -maxdepth 1 -type f -wholename "$1" | xargs -I{} echo -e "<h2>Filename: {}</h2>\n<pre> `cat *`\n</pre>\n<br>
Word Count $(wc -w ${})";
오류 메시지가 나타납니다 ${}
. 아마도 구문 분석 때문인 것 같지만 해결 방법을 모르겠습니다. 누구든지 도와주실 수 있나요?
답변1
원하는 출력을 생성하는 또 다른 간단한 스크립트를 작성한 다음 에서 find
실행하십시오 . 예를 들면 -exec
다음 과 같습니다.xargs
find . -maxdepth 1 -type f -wholename "$1" -exec /path/to/myscript.sh {} +
myscript.sh:
#!/bin/sh
for i in "$@"; do
printf "<h2>Filename: %s</h2>\n<pre>" "$i"
cat *
printf "\n<pre>\n<br>Word Count %s\n" "$(wc -w "$i")"
done
저장하고 를 실행하여 실행 가능하게 만듭니다 chmod +x myscript.sh
.
발견된 모든 파일(즉, 현재 디렉터리의 모든 파일)에 대해 cat을 실행 하려는 이유가 무엇인지 모르겠지만 cat *
, 그것이 바로 여러분이 요구하는 것입니다. 각 파일의 내용을 원하지 않으시나요? cat "$i"
대신 사용하십시오 cat *
.
또는 추가 스크립트를 사용하지 않고 -exec sh -c ...
다음 명령을 사용하여 이를 수행 할 수 있습니다.
find . -maxdepth 1 -type f -wholename "$1" \
-exec sh -c 'for i in "$@"; do
printf "<h2>Filename: %s</h2>\n<pre>" "$i";
cat "$i";
printf "\n<pre>\n<br>Word Count %s\n" "$(wc -w "$i")";
done' find-sh {} +
(가독성을 높이기 위해 추가 줄 바꿈이 추가되었습니다. 스크립트는 줄 바꿈이 있든 없든 동일하게 작동합니다.)
그런데 bash 기능만 사용하여 스크립트를 실행해야 -exec bash -c ...
한다면 -exec sh -c ...
.