“find”출력에서 상대 경로 만 강제 적용하려면 어떻게해야합니까?


25

여러 디렉토리의 특정 확장자를 가진 파일을 단일 tar-ball로 압축 할 수있는 스크립트를 작성하려고합니다. 현재 스크립트 파일에있는 것은 다음과 같습니다

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \;

$rootDir검색 할 기본 경로는 어디에 있습니까 ?

tar 파일에서 경로가 절대적인 것을 제외하고는 괜찮습니다. 상대 경로를 선호합니다 $rootDir. 어떻게하면 되나요?

현재의 실시 예 이다 출력 :tar -tf docs.tar$rootDir/home/username/test

home/username/test/subdir/test.doc
home/username/test/second.doc

내가 원하는 결과물 :

./subdir/test.doc
./second.doc

답변:


12

find원하는 루트 디렉토리에서 실행 하고 find의 옵션 에서 절대 시작점을 지정하지 않으면 tar구성 하는 명령 호출 에 대한 상대 경로가 출력됩니다 . 이렇게 :

cd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;

현재 작업 디렉토리를 영구적으로 변경하지 않으려는 경우 bash쉘과 유사하거나 사용중인 경우

pushd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;
popd

대신에.

push / popd가 모든 쉘에 존재하지는 않으므로 맨 페이지를 적절히 확인하십시오. 그것들은 bash에는 있지만 기본 sh 구현에는 없기 때문에 명시 적으로 사용하는 동안 /bin/bash스크립트를 /bin/sh대신 사용 하면 요청할 수 없습니다 (bash의 개선 사항이없는 더 작은 쉘에 매핑 될 수 있기 때문에)


감사. 훌륭하게 일했습니다. 리눅스가 밀거나 터지는 것을 몰랐다.
셰인

3
또는 사용 cd $rootDir하고 cd - (최소한의 bash). ( cd $rootDir ; find ... )서브 쉘에서 모든 작업을 수행 할 수도 있습니다.
Daniel Beck

9

지시문 에서 %P형식을 사용할 수 있습니다 -printf.

find ${rootDir} -name '*.doc' -printf "%P\n"

귀하의 예에 표시됩니다 :

subdir/test.doc
second.doc

그런 다음 다음 과 같이 exec 명령을 실행하기 위해이 find목록을 for표현식 에 사용할 수 있습니다 .

for f in $( find ${rootDir} -name '*.doc' -printf "%P\n" );
do
    tar rvf docs.tar ${f}
done

1
허용되는 솔루션은 작동하지만 기본적으로 해킹입니다. IMHO 이것은 질문에 대한 올바른 해결책이어야합니다.
Narcolessico

감사합니다 Narcolessico. 그것은 또한 MHO입니다 :-)
Gabriel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.