문제

다음 명령을 실행하려고합니다.

find . -iname '.#*' -print0 | xargs -0 -L 1 foobar

"foobar"가 .bashrc 파일에 정의 된 별칭 또는 함수 인 경우 (내 경우에는 하나의 매개 변수를 취하는 함수). 분명히 Xargs는 이것을 실행할 수있는 것으로 인식하지 않습니다. 이것을 해결하는 영리한 방법이 있습니까?

도움이 되었습니까?

해결책

대화식 쉘 만이 별명에 대해 알고 있으므로 왜 분리되지 않고 별명을 실행하지 마십시오. xargs?

find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done

파일 이름에 신자 라인이 없다고 확신한다면 (ick, 왜?)

find . -iname '.#*' -print | while read -r i; do foobar "$i"; done

또는 그냥 find -iname '.#*' | ..., 기본 디렉토리는이므로 . 그리고 기본 조치는입니다 -print.

하나 더 대안 :

 IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done

Bash에게 단어는 단어가 Newlines에서만 나뉘어져 있다고 말합니다 (기본값 : IFS=$' \t\n'). 그러나 당신은 이것에주의해야합니다. 일부 스크립트는 변경 사항에 잘 대처하지 않습니다 $IFS.

다른 팁

Bash를 사용하면 별명 (또는 기능)에 전달되는 Args 수를 다음과 같이 지정할 수도 있습니다.

alias myFuncOrAlias='echo'  # alias defined in your ~/.bashrc, ~/.profile, ...
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0
echo arg1 arg2 | xargs  bash -cil 'myFuncOrAlias "$@"' arg0

이것은 작동하지 않습니다 xargs 할 수있을 것으로 기대합니다 exec 그만큼 프로그램 매개 변수로 제공됩니다.

부터 foobar 귀하의 경우에는 단지 A입니다 bash 별칭 또는 기능 실행할 프로그램이 없습니다.

시작하는 것이 포함되지만 bash 다음으로 반환 된 각 파일에 대해 find, 당신은 다음과 같이 작은 쉘 스크립트를 쓸 수 있습니다.

#!/bin/bash
. $(HOME)/.bashrc
func $*

그런 다음 해당 스크립트의 이름을 매개 변수로 전달합니다. xargs

나는 보통 다음과 같이 찾기를 사용합니다.

find . -iname '' -exec cmd '{}' \;

'{}'는 파일 이름으로 대체되고 ; 실행 체인을 종료하려면 필요합니다. 그러나 기능이 작동하지 않으면 Bash를 통해 실행해야 할 수도 있습니다.

find .. |sed -e "s/.*/cmd '&'/"|bash

라인에서 각 파일을 인쇄하고 명령으로 이것을 접두사 한 다음 실행을 위해 배쉬로 파이프합니다. | bash를 먼저 건너 뛰면 어떤 일이 일어날 지 확인하십시오.

노력하다

find . -iname '.#*' -print0 | xargs -0 -L 1 $(foobar)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top