2013-03-31 3 views
1

find 명령을 사용하여 홈 디렉토리에서 RCS에 체크인 된 모든 파일을 찾으려고합니다. 여기에는 c,v과 같은 것으로 끝나는 파일이 포함됩니다. 나는 그런RCS에 체크인 된 모든 파일을 찾으려면 'find'unix 명령을 사용하려고 시도합니다.

find . -name \*v 
find . -name \*c,v 

로 명령을 실행하면이 내가 원하는 방식에 가까운 날이 대단한

./LABTECH/RCSlab/trig/RCS/main.c,v 

처럼 보이는 파일 줄 것이다 어떤 이유로 난에 임의의 파일이있는 경우를 제외하고 av 또는 c로 끝나는 내 컴퓨터, v RCS에없는 컴퓨터, 또한 그 것을 반환 할 것입니다. find . -name \*RCS\*c,v과 같은 것은 작동하지 않으며 반환하지 않습니다. find . -name RCS\*은 RCS 디렉토리를 리턴하지만 RCS 디렉토리 안의 파일은 리턴하지 않습니다.

어딘가에 내 홈 디렉토리에서부터 RCS 디렉토리에있는 모든 파일을 반환하는 find 명령을 얻을 수 있습니까? 나중에 불필요한 파일을 걸러 낼 수 있지만 RCS 디렉토리의 파일 만 보여 주면됩니다.

모든 대답을 읽은 후에 저는 v가 RCS 파일이라는 가정을 결정했습니다. 선생님이 그런 질문을하기 위해 스크립팅을 다루지 않았기 때문에 RCS 파일이 가장 좋은 방법입니다. 우리는 xargs 나 grep에 파이프를 연결해서는 안되며 -path는 유닉스 버전에서 작동하지 않습니다. perreal을 사용하면 -name을 사용하면 '/'와 일치하는 것을 허용하지 않는다는 사실을 알면 도움이되었습니다.이 문구는 내가 가지고 있지만 묻지 않은 다른 질문을 해결합니다. 나는 경로 나 어떤 종류의 다음 명령이나 스크립트없이 이것을 할 방법이 없다는 것을 이해하게되었습니다. 도와 주셔서 감사합니다.

답변

0

당신은 파일 이름이 ,v을 종료하는 경우, 그것이 RCS 파일이라는 가정에서 작동합니다. 어떤 interlopers도 그다지 많지 않아야합니다.

find $HOME -name '*,v' 

당신이 RCS 서브 디렉토리를 사용하는 방법에 대한 일치하는 경우에, 당신이 RCS의 하위 디렉토리에있는 파일을 추적하기 위해 POSIX find 옵션 -path을 사용할 수 있습니다

find $HOME -path '*/RCS/*,v' 

를 식별해야하는 경우

find $HOME -name '*,v' -exec rcsfiles {} + 

: 실제 RCS 파일은, 당신은 파일이 정말 RCS 파일이 있는지 확인하기 위해 몇 가지 프로그램 (스크립트)을 실행해야합니다은 실제로 주어진 RCS 파일 인 인수의 이름을 나타내는 가설적인 스크립트입니다.rlog 명령을 사용하여 파일이 RCS 파일인지 여부를 식별합니다. rcs 명령에는 RCS 파일의 유효성을 확인하는 조작이 없습니다. 이 이름이 RCS라는 이름의 디렉토리 아래에 ,v로 끝나는 모든 파일을 찾을 수

for file in "[email protected]" 
do 
    if rlog "$file" >/dev/null 2>&1 
    then echo "$file" 
    fi 
done 
1

이 일을 시도해보십시오, find의 버전이 -path 옵션이 부족하면

find . -path '*/RCS/*,v' 

을 수행 할 수 있습니다 테스트 :

find . -name '*,v' -print | grep -E 'RCS/[^/]+,v$' 
+1

일반적으로 RCS 디렉토리가 파일 이름 바로 앞에 오므로'-path '*/RCS/*, v''를 써서 RCS 파일을 식별하십시오. –

0

man-pagefind에서 :

-name pattern 
     Because the leading directories are removed, the file names 
     considered for a match with -name will never include a slash, 
     so `-name a/b' will never match anything (you probably need 
     to use -path instead). 

그래서 당신이 할 수있는을 사용하십시오. sputnick의 답변에서와 같이 -name 대신. 또 다른 방법은 먼저 해당 디렉토리를 찾는 :

find -name '*RCS' -type d | xargs -n1 -I{} find {} -name '*.c,v' 
0
find . -type f -name '*,v' | grep /RCS/ 

다음 rcsfiles 스크립트가 아니라 간단 할 수 있습니다.

당신이해야 할 경우

그들이 RCS 디렉토리 아래 즉시있어 :

find . -type f -name '*,v' | grep '/RCS/[^/]*$' 

이것은 /RCS/ 후 추가 / 문자가 없는지 확인합니다.

CVS도 ,v 접미사 (동일한 파일 형식)를 사용하며 저장소 파일에 특별한 디렉토리 이름을 사용하지 않습니다. CVS 디렉토리를 사용하지만 파일을 체크 아웃 할 때 만들어지며 소수의 메타 데이터 파일 만 포함합니다. 시스템에서 CVS를 사용하지 않는다면 아마 문제가되지 않을 것입니다. RCS와 CVS를 모두 사용하는 경우 위의 내용은 RCS가 유지 관리하는 파일이 ,v이며 CVS가 유지 관리하는 파일은 무시합니다.

find -path을 사용하는 다른 답변이 더 좋을 수도 있지만, 다른 방법으로는 grep 정규 표현식이 find -path에서 허용하는 셸 패턴보다 강력합니다.