2012-07-05 3 views
1

파일에서 입력을 받아 stdout (단일 파일로 리디렉션하려는)으로 출력하도록 설계된 실행 파일을 C++로 작성했습니다. 문제는, 폴더의 모든 파일에서이 작업을 실행하고 사용중인 find 명령이 협조하지 않는다는 것입니다. 내가 사용하는 명령은 다음과 같습니다.bash의 C++ 실행 파일에 대한 반복 입력 리디렉션

find -name files/* -exec ./stagger < {} \; 

예제를 보면, {}은 파일 이름을 대체합니다. 나는이 하나 개의 파일에 모든 결과를 얻기 위해, 밖으로 다림질되면, 단순히 패턴 명령 >> outputfile.txt를 사용할 수 있다고 가정하고

-bash: {}: No such file or directory 

: 그러나, 나는 오류를 얻고있다.

도움을 주셔서 감사 드리며 질문을 명확히 할 수 있는지 알려 주시기 바랍니다.

답변

4

문제는 재 지정이 찾기 명령보다 먼저 처리된다는 것입니다. 당신은 간부 호출에 다른 bash는 프로세스를 생성하여이 문제를 해결할 수 있습니다

find files/* -exec bash -c '/path/to/stagger < "$1"' -- {} \; 
+0

완벽하게 작동합니다. 고마워요! –

0

단순히 탈출보다 작음 기호, 그 리디렉션 find 명령보다는가 실행되는 쉘에 의해 수행되도록 :

find files/* -exec ./stagger \< {} \; 
+0

어떤 이유로이 옵션에 잘못된 옵션 오류가 표시됩니다."발견 : 불법 옵션 - n 찾기 : 불법 옵션 - a 찾기 : 불법 옵션 - m 찾기 : 잘못된 옵션 - e " –

+0

'-name' 옵션은이 문맥에서 유효하지 않으므로 나는 그것을 제거했습니다. –

+0

이것은 작동하지 않을 것입니다. 이것은'./stagger' 프로그램에 두 개의 인수, 즉 리터럴'<'과 파일 이름을 전달하는 것입니다. 파일 리다이렉션이 작동하기 위해서는 쉘이 그것을해야만한다. (프로그램 자체가 할 수 없다면) 쉘은'find' 명령이 실행 된 후에 그것을해야한다. 조단의 대답이이를 제대로 수행합니다. –

2
  1. < 오퍼레이터 이전 명령을 실행하는 쉘 리디렉션로 해석된다. 쉘은 {}이라는 파일의 입력을 find의 stdin으로 재지 정하려고 시도하고 파일이 없으면 오류가 발생합니다.

  2. -name의 인수는 따옴표로 묶이지 않고 글자를 포함합니다. 쉘은 경로명 확장을 적용하고 찾기에 무의미한 인수를줍니다.

  3. 파일 이름에는 슬래시를 사용할 수 없습니다. -name에 대한 인수는 인용 된 경우에도 작동하지 않습니다. GNU find를 사용할 수있는 경우 -path을 사용하여 glob 패턴 files/*을 지정할 수 있지만 이는 -regex이 필요하다는 점에서 "파일 이름의 파일"을 의미하지 않습니다. 휴대용 솔루션이 더 어렵습니다.

  4. find을 시작할 경로를 하나 이상 지정해야합니다.

셸이 리디렉션을 수행하도록하려는 경우, 다음은 GNU find를 사용하는 방법입니다. 당신이 배쉬를 사용하는 경우

find . -type d -name files -exec sh -c 'for x; do for y in "$x"/*; do [ -f "$y" ] && ./stagger <"$y"; done; done' -- {} + 

,이 문제가 아주 좋은 후보입니다 :

find . -type f -regex '.*foo/[^/]*$' -exec sh -c 'for x; do ./stagger <"$x"; done' -- {} + 

이 아마 (이 작동하지 않습니다 -depth-prune) find를 사용하여 최고의 휴대용 방법입니다 find 대신 globstar 패턴을 사용하면됩니다.

#!/usr/bin/env bash 
shopt -s extglob globstar nullglob 

for x in **/files/*; do 
    [[ -f "$x" ]] && ./stagger <"$x" 
done 
+0

+1에 대한 설명을 들었지만, 그가 원했던 것이 내 대답에서 추측 한 것입니다. 재귀 적으로 상대 경로 파일 /에있는 모든 파일과 디렉토리. – jordanm

+0

@jordanm 그럴 수 있다고 들린다. 읽는 디렉토리를 열면 어떤 도움이 될지 확실하지 않습니다. – ormaaj

관련 문제