2014-02-24 3 views
2

지정된 디렉토리를 탐색하고 파일을 찾고 내용을 정렬 한 다음 새 파일을 만드는 bash 스크립트를 만들려고합니다. 지금 당장 실행해야 할 유일한 문제는 어떻게 각 파일에 다른 이름을 부여 할 것인가입니다. 코드 :쉘 스크립트를 통해 고유 한 파일 이름 지정

당신이 find 명령 내부에 리디렉션을
find $1 -name '*.grd' -exec sort -k 2,2 {}> {}.std \; 

답변

3

, 쉘은 find을 시작하기 전에, 한 번만 리디렉션을 수행한다. -exec은 쉘을 사용하지 않고 자식을 호출하기 위해 execv() 호출을 직접 사용하기 때문에 인수 내에 리디렉션이 적용되지 않습니다. (>file과 같은 리디렉션은 실행 프로세스의 일부로 운영 체제가 아니라 호출 셸에서 수행합니다. 이 쉘 자체를 시작했다, 당신은 find -exec를 사용하여이 주장 할 경우,

while IFS= read -r -d '' filename; do 
    sort -k2,2 <"$filename" >"${filename}.std" 
done < <(find "$1" -name '*.grd' -print0) 

다른 방법 : 대부분의 제어를 위해

find -exec을 사용하려고하지만, 직접 쉘에서 결과를 처리하지 않습니다 , 거기 처리 및 리디렉션을 수행

find "$1" -name '*.grd' -exec bash -c \ 
    'while (($#)); do sort -k2,2 <"$1" >"$1.std"; shift; done' _ {} + 

다른 접근 방식 the UsingFind page on the Wooledge wiki (특정 섹션 8을 통해 5 참조)에서 사용할 수 있습니다.

+0

스크립팅을 처음 접해 보니 처음에는 조금 혼란 스러웠습니다. 코드가 제대로 작동하는 것 같지만 올바르게 설명 할 수 있어야합니다. IFS를 명확히 할 수 있습니까? – user3344763

+1

@ user3344763 IFS를 지우면 뒤따라 오는 공백 문자를'read'가 제거하지 못하게됩니다. 공백 문자는 공백이나 탭 문자로 끝나면 버그가됩니다. 비슷하게,'-d ''인자는 NUL으로 분리 된 내용을 기대하며, 파일명에 개행 문자가 들어 있으면 코드를 안전하게 만든다. (유닉스에서는 합법적이다.) find에 대한'-print0' 인자는 파일 이름을 출력 할 때 NUL 구분자를 사용하도록 지시합니다. –

+0

@ user3344763 ... 일반적으로 공백이있는 파일 이름 (특히 후행 공백 문자 - 개행 문자 등)에 대해 쉘 스크립트가 "작동 함"이라고하기 전에 테스트하는 것이 좋습니다. 조심하지 않으면 많은 실수가 있습니다. –

관련 문제