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

관련 정보