![xargs 및 대체에 대한 도움이 필요합니다.](https://rvso.com/image/191770/xargs%20%EB%B0%8F%20%EB%8C%80%EC%B2%B4%EC%97%90%20%EB%8C%80%ED%95%9C%20%EB%8F%84%EC%9B%80%EC%9D%B4%20%ED%95%84%EC%9A%94%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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 ...
.