xargs 및 대체에 대한 도움이 필요합니다.

xargs 및 대체에 대한 도움이 필요합니다.

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 ....

관련 정보